Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/07/2011, 14h49   #1
Invité de passage
 
Homme Christophe Beau
Chef de projet MOA
Inscription : juin 2011
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Christophe Beau
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Chef de projet MOA

Informations forums :
Inscription : juin 2011
Messages : 3
Points : 0
Points : 0
Par défaut Remplacer dans trigger INSERT par UPDATE si clé existe

Bonjour.

Comment remplacer dans un trigger, l'exécution INSERT par UPDATE après avoir contrôlé que le champ contenant la clé, existe déjà dans la table concernée par l’Insert (pour traitement de tables héritées où le contrôle d’unicité de la clé n’est pas possible nativement).

Merci.

Mon ébauche :
Code :
1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE FUNCTION f_ctrl_doublons() RETURNS TRIGGER AS $t_ctrl_doublons$
BEGIN
 IF (TG_OP = 'INSERT') THEN
  IF (SELECT count(*) FROM TABLE WHERE cléinsérée = cléexistante) <> NULL;
       Provoquer ici le remplacement l’INSERT par un UPDATE
    END IF;
  END IF;
END;
 
CREATE TRIGGER t_ctrl_doublons BEFORE INSERT ONTABLEFOR EACH ROW ?
Christop33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 13h56   #2
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 174
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 174
Points : 6 460
Points : 6 460
Dans la doc il y a ton bonheur, les dev l'on fait pour toi

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
CREATE FUNCTION merge_db(KEY INT, DATA TEXT) RETURNS VOID AS
$$
BEGIN
    LOOP
        -- first try to update the key
        UPDATE db SET b = DATA WHERE a = KEY;
        IF found THEN
            RETURN;
        END IF;
        -- not there, so try to insert the key
        -- if someone else inserts the same key concurrently,
        -- we could get a unique-key failure
        BEGIN
            INSERT INTO db(a,b) VALUES (KEY, DATA);
            RETURN;
        EXCEPTION WHEN unique_violation THEN
            -- do nothing, and loop to try the UPDATE again
        END;
    END LOOP;
END;
$$
LANGUAGE plpgsql;
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h16.


 
 
 
 
Partenaires

Hébergement Web