Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Trigger for delete

3 réponses
Avatar
J
Bonjour,

J'ai 2 tables "maitre" et "detail" avec une "foreign key" on "cascade
delete".

Dans la table "detail", je fais une opération pendant un "trigger for
delete".

Cette opération nécessite des informations venant des données des lignes
effacées (table deteled) et des lignes parente de ces données (que
j'obtiens en faisant un join entre deleted et maitre).

Si j'efface une ligne de la table "detail", pas de problème, mon trigger
fonctionne (j'obtiens toutes les données).
En revanche, si j'efface une ligne "maitre", la ou les lignes "detail"
sont effacées en cascade, le trigger est appelé, la table deleted
contient bien les lignes effacées, *MAIS*, la table maitre ne contient
plus la ligne parente des lignes deleted.

Est-ce "normal", est-ce qu'il y a une syntaxe pour accéder à la ligne
parente effacée ?
Pour l'instant, je n'ai trouvé qu'une solution, c'est de supprimer le
cascade sur la foreign key et de faire un trigger instead of delete sur
la table "maitre" (pour effacer les lignes de la table "detail" puis les
lignes "maitre"). Mais compte tenu de ma base de données, ça représente
pas mal de travail de tout changer (les trigger instead of imposent
certaines contraintes)...

Une idée ?

Merci.

Jean

3 réponses

Avatar
Med Bouchenafa
Une solution serait :
Dans le trigger de la table "maitre", sauvegarder dans une table temporaire
le contenu de deleted
Dans le trigger de la table ""detail", lire le contenu a partir de cette
table temporaire

Bien cordialement
Med Bouchenafa

"J" wrote in message
news:49998a48$0$21359$
Bonjour,

J'ai 2 tables "maitre" et "detail" avec une "foreign key" on "cascade
delete".

Dans la table "detail", je fais une opération pendant un "trigger for
delete".

Cette opération nécessite des informations venant des données des lignes
effacées (table deteled) et des lignes parente de ces données (que
j'obtiens en faisant un join entre deleted et maitre).

Si j'efface une ligne de la table "detail", pas de problème, mon trigger
fonctionne (j'obtiens toutes les données).
En revanche, si j'efface une ligne "maitre", la ou les lignes "detail"
sont effacées en cascade, le trigger est appelé, la table deleted contient
bien les lignes effacées, *MAIS*, la table maitre ne contient plus la
ligne parente des lignes deleted.

Est-ce "normal", est-ce qu'il y a une syntaxe pour accéder à la ligne
parente effacée ?
Pour l'instant, je n'ai trouvé qu'une solution, c'est de supprimer le
cascade sur la foreign key et de faire un trigger instead of delete sur la
table "maitre" (pour effacer les lignes de la table "detail" puis les
lignes "maitre"). Mais compte tenu de ma base de données, ça représente
pas mal de travail de tout changer (les trigger instead of imposent
certaines contraintes)...

Une idée ?

Merci.

Jean


Avatar
J
Med Bouchenafa a écrit :
Une solution serait :
Dans le trigger de la table "maitre", sauvegarder dans une table
temporaire le contenu de deleted
Dans le trigger de la table ""detail", lire le contenu a partir de cette
table temporaire



Merci pour cette idée, mais elle me semble encore plus contraignante que
de créer des triggers instead of dans les tables parentes. Je n'ai pas
trop l'habitude de manipuler ce type de table.

Jean
Avatar
Patrice
Perso je n'ai pas trop l'habitude des cascades (!) mais je crois me souvenir
que j'avais conclu une fois que :
- c'est sans doute implanté avec quelque chose qui ressemble à un trigger
- si on ne fait que de la destruction utiliser la destruction en cascade. Si
il y a un trigger à mon avis autant implanter soi-même la destruction en
cascade.

(perso j'utilise des SP dans lequels je fais éventuellement mes
destructions en cascade).

--
Patrice

"J" a écrit dans le message de groupe de discussion
: 499a6b2c$0$24238$
Med Bouchenafa a écrit :
Une solution serait :
Dans le trigger de la table "maitre", sauvegarder dans une table
temporaire le contenu de deleted
Dans le trigger de la table ""detail", lire le contenu a partir de cette
table temporaire



Merci pour cette idée, mais elle me semble encore plus contraignante que
de créer des triggers instead of dans les tables parentes. Je n'ai pas
trop l'habitude de manipuler ce type de table.

Jean