[ORACLE] Trigger pour ON UPDATE CASCADE

Fermé
Babouche - 10 mars 2009 à 16:34
 Babouche - 11 mars 2009 à 08:29
Bonjour,

Sachant que la syntaxe ON UPDATE CASCADE n'est pas reconnue dans ORACLE, il faut créer un trigger.
Exemple :

CREATE TABLE Table_P (
ID_P INTEGER NOT NULL ,
ID_E INTEGER NOT NULL ,
NUM_PRO INTEGER NOT NULL ,
NUM_L INTEGER NOT NULL ,
PRIMARY KEY(ID_P) ,
FOREIGN KEY(ID_E)
REFERENCES Table_E(ID_E)
ON DELETE CASCADE
ON UPDATE CASCADE);

Pour remplacer la syntaxe ON UPDATE CASCADE, il faut créer le trigger suivant :

CREATE OR REPLACE TRIGGER Update_Table_P
AFTER UPDATE OF ID_P ON Table_P
REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW
DECLARE
V_NEWID VARCHAR2 (6);
V_OLDID VARCHAR2 (6);
BEGIN
V_NEWID := :NEW.ID_P;
V_OLDID := :OLD.ID_P;

Jusque là je pense avoir raison.

Ce que je voudrai savoir, c'est comment créer le trigger avec cette exemple :

CREATE TABLE Table_A (
ID_A INTEGER NOT NULL IDENTITY ,
ID_R INTEGER NOT NULL ,
NUM_P SMALLINT NOT NULL ,
NUM_L SMALLINT NOT NULL ,
PRIMARY KEY(ID_A) ,
FOREIGN KEY(NUM_L)
REFERENCES Table_L (NUM_L)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY(ID_R, NUM_P)
REFERENCES Table_R(ID_R, NUM_P)
ON DELETE CASCADE
ON UPDATE CASCADE);

Pouvez-vous m'aider ?
A voir également:

3 réponses

J'ai oublié un bout du trigger pour l'exemple, je le remet en entier :

CREATE OR REPLACE TRIGGER Update_Table_P
AFTER UPDATE OF ID_P ON Table_P
REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW
DECLARE
V_NEWID VARCHAR2 (6);
V_OLDID VARCHAR2 (6);
BEGIN
V_NEWID := :NEW.ID_P;
V_OLDID := :OLD.ID_P;

UPDATE Table_P
SET ID_P = V_NEWID
WHERE IP_P = V_OLDID;
END;
0
Fallentree Messages postés 2309 Date d'inscription mercredi 25 février 2009 Statut Membre Dernière intervention 22 juillet 2019 209
10 mars 2009 à 17:18
Regarde là peut etre ...
http://books.google.fr/books?id=P8lDLYWio9QC&pg=PA219&dq=oracle+ON+UPDATE+CASCADE+trigger#PPA215,M1

D'apres ce que j'ai compris...
le trigger permet de gerer des procedes alternatifs à la gestion uples et d'exclusion de masse...
Et
la rédaction est plus complexe que ta proposition, et fait appel à des jointures et patati et patata...
Quoique ta proposition est deja bien compliqué .. Old as old new as new ????

En gros, tu veux verifier que ta jointure est correctement inserer dans la table de suivi de old et new ????
D apres l exemple
Create tigger patatipatata ....
When Exist( select Old from table_R where old=new) Vérifie la jointure
Begin ...

C'est vrai que c est pas clair...
Exclure ou etre sur de créer...
0
Old as old new as new permet de déclarer les tables intermédiaires avant l'update.
Donc avant de faire la mise à jour, on va insérer les nouvelles valeurs dans les clefs étrangères pour qu'après on puisse modifier la valeur de la clef primaire. Une fois que toutes les clefs étrangères possède la nouvelle valeur, on peut modifier la clef primaire.

Enfin c'est ce que j'ai compris lol
0