|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
Bonjour,
j'ai une table avec deux triggers :
Lors du DELETE qui figure dans mon premier TRIGGER, le deuxième n'est pas appelé, donc ma réécriture de cascade ne fonctionne pas, donc ma suppression non plus. A part passer par une procédure stockée, y a-t-il une solution (configuration ou autre ?? ). Je n'aimerais pas passer par la procédure stockée car il faudrait faire un curseur pour parcourir les tuples du TRIGGER ensembliste, et c'est trop lent. Merci d'avance de votre aide ! |
|
|
00
|
|
|
#2 |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
J'ai tenté d'activer la récursivité des TRIGGERS, toujours pas bon.
|
|
|
00
|
|
|
#3 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 667 ![]() |
Bonjour,
Sans le code, difficile de vous aider ... @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#4 |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
L'option NESTED TRIGGERS est également activée...
|
|
|
00
|
|
|
#5 | ||
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
Voici ma table avec les deux TRIGGERS. C'est une table de test, elle n'est pas très propre.
Code :
|
||
|
|
00
|
|
|
#6 | ||||||||||||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
D'abord il est inutile de faire un curseur comme vous le suggérer, ensuiste tout dépend du code de vos trigger.
postez les ! En effet il n'y a pas de raison que cela marche mal... Démonstration : Code :
Code :
Code :
Code :
Code :
Code :
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
||||||||||||
|
00
|
|
|
#7 |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
Le code de mes TRIGGERS est assez long. C'est pourquoi j'ai fait un exemple succin illustrant mon problème. Le code que j'ai posté ne fonctionne pas chez moi. Ensuite, la solution CURSOR serait envisagée si je devais passer par les procédures stockées. Si pas de SP, pas de CURSOR. C'est clair pour moi.
La différence entre mon code et le votre se trouve dans le TRIGGER FOR UPDATE. Je DELETE des tuples de la même table, vous supprimez des tuples d'une autre table. Les TRIGGERS FOR UPDATE et INSTEAD OF DELETE sont sur la même table ! Je pense que c'est la source du problème. |
|
|
00
|
|
|
#8 | |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 667 ![]() |
Citation:
Si cela n'est pas possible, c'est que votre conception est fausse. Votre second trigger doit être un AFTER et pas un INSTEAD OF @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
|
00
|
|
|
#9 |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
Je ne peux malheureusement pas le mettre en AFTER DELETE. J'ai 4 tables sur lesquelles j'ai été obligé à réécrire la cascade en INSTEAD OF DELETE. Les deux tables du fond de la cascade doivent être archivées avant suppression. Si je fait du AFTER DELETE, je perds les référence entre les tuples DELETED de mes 4 tables en cascade. La cascade est pioritaire sur les TRIGGERS...
J'ai donc mes 4 tables qui ont un INSTEAD OF DELETE, et j'ai besoin d'un FOR UPDATE ou AFTER UPDATE sur l'une d'entre elles... Etant donnée qu'on ne peut pas passer des tables aux procédures stockées, je ne vois pas d'autres solutions que de faire un curseur si la suppression devait se faire dans une procédure stockée. Mes deux triggers feraient alors appel à la même procédure stockée.. bof bof... |
|
|
00
|
|
|
#10 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Encore une fois, vous n'avez sans doute pas besoin de curseur dans votre PS.
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#11 |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
Je pense que vous avez raison. Par contre je ne vois pas comment faire.
Si j'avais du le faire par SP, j'aurais fait un curseur dans mon trigger qui aurait bouclé, et appelé autant de fois ma SP qu'il n'y a de tuples dans ma table DELETED. Comment feriez-vous pour traiter tous les tuples qui sont dans ma table DELETED dans une procédure stockée ? |
|
|
00
|
|
|
#12 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 667 ![]() |
Ce que je ne parviens pas à comprendre c'est pourquoi le trigger INSTEAD OF ne se déclenche pas sur le DELETE du trigger AFTER, alors que si on transforme le trigger INSTEAD OF en AFTER, tout se passe comme prévu.
Je n'ai rien trouvé dans les notes de la documentation, donc je cherche toujours une explication ... @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#13 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Citation:
1) le plus complexe, mais la plus performante est de réintégrer le code de la SP dans le trigger en utilisant notamment les CTE 2) avec une variable table dans laquelle on place les clef des lignes à traiter avec en sus une colonne DEL de type BIT à O, on fait un WHILE EXISTS... qui va récupérer une clef, lance la proc et UPDATE la table variable... A lire : http://sqlpro.developpez.com/cours/s...r_avoidCursor/ A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
|
00
|
|
|
#14 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Citation:
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
|
00
|
|
|
#15 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#16 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
De toute façon ce que stéphane julien essaye de faire, c'est de la programmation spaghetti événementielle... Bref, une grosse m..... (je dis pas le mot, car on va encore me tomber dessus !!!)
S'il nous disait ce qu'il veut faire au point de vu fonctionnel on pourrait sans doute l'orienter... A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#17 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 667 ![]() |
D'accord, mais en supposant que notre modèle soit correct et l'on n'ait pas d'autre choix que d'implémenter ces deux triggers, que faire ?
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#18 | |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
Tout d'abord, merci pour vos réponses et votre rapidité !
C'est peut-être là que j'ai un problème de conception, mais je ne vois vraiment pas comment faire autrement. Peut-être pouvez-vous m'aider à démêler mon plat de Spaghettis Citation:
Et une DB qui fait ce dont j'ai besoin : dump.sql Je ne peux malheureusement pas envoyer ma base complète avec 80 tables et des données confidentielles. Si je supprime un tuple de la table B, l'archivage de C et C_Data fonctionne bien. Par contre si j'update son champ Status_Id à 2, le TRIGGER B_tru est déclenché, il me fait un DELETE, et je ne passe pas dans le TRIGGER B_trd. Etant donné que mon TRIGGER B_trd (INSTEAD OF DELETE) est petit, je pourrais dupliquer le code dans le TRIGGER B_tru (AFTER UPDATE), mais c'est ce que j'essaie d'éviter. Ce serait la solution de secours... Merci d'avance de votre aide ! |
|
|
|
00
|
|
|
#19 | |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
Citation:
|
|
|
|
00
|
|
|
#20 |
|
Membre régulier
![]() Inscription : septembre 2007 Messages : 339 ![]() |
Salut !
Je suis à nouveau tombé dans ce cas de figure ailleurs dans ma base de données. Pour résoudre, j'écris le contenu de mon INSTEAD OF DELETE dans le AFTER UPDATE (3 lignes de code). Ce n'est cependant pas la solution la plus élégante. Si quelqu'un trouve une solution pour que le TRIGGER INSTEAD OF DELETE soit appelé aussi depuis un AFTER UPDATE, je suis preneur... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com