Hello,
Je cherche à trouver via une requête tous les triggers d'une DB.
Je m'attendais à les trouver dans INFORMATION_SCHEMA.ROUTINES mais ce n'est apparemment pas le cas.
Quelqu'un pourrait-il m'aiguiller svp ?
Hello,
Je cherche à trouver via une requête tous les triggers d'une DB.
Je m'attendais à les trouver dans INFORMATION_SCHEMA.ROUTINES mais ce n'est apparemment pas le cas.
Quelqu'un pourrait-il m'aiguiller svp ?
Pour les triggers DML :
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT * FROM sys.triggers;
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT OBJECT_NAME(object_id), * FROM sys.objects WHERE type = 'TR'
On ne les voit pas dans les vues normées du schéma INFORMATION_SCHEMA, peut-être par respect de la norme SQL ? SQLPro peut sans doute nous éclairer sur ce point.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT OBJECT_NAME(object_id), * FROM sys.sql_modules WHERE OBJECTPROPERTY(object_id, 'IsTrigger') = 1;
Merci pour cette réponse.
Je me dois cependant de compléter ma question... Depuis sys.triggers, je peux récupérer apparemment le nom mais est-il également possible de récupérer le code des triggers en question ?
J'imagine que cela doit bien se trouver quelque part... Je vais fouiller un peu les vues systèmes maintenant que j'ai leur object_id.
L'idée est d'arriver à identifier les triggers effectuant des ordres sql sur une table précise.
S'ils avaient été dans INFORMATION_SCHEMA.ROUTINES, j'aurais fait un like sur la colonne ROUTINE_DEFINITION.
Voici une solution qui a l'air de fonctionner :
Cela me donne bien tous les triggers ayant un rapport avec la table T_EXPORT_EXP.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT * FROM SYS.syscomments COM INNER JOIN SYS.sysobjects OBJ ON COM.id = OBJ.id WHERE COM.TEXT LIKE '%TRIGGER%' AND COM.TEXT LIKE '%T_EXPORT_EXP%'
Par contre, il n'y a pas une histoire comme quoi les tables sys*** sont obsolètes ??
Si oui, quelles seraient la "bonne" pratique ?
Hello,
Et pourquoi pas utiliser OBJECT_DEFINITION() ?
++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT *, OBJECT_DEFINITION(object_id) as trigger_definition FROM sys.triggers;
Bonjour,
La réponse a été donnée par Rudib, il vous faut juste l'adapter suivant votre besoin (sys.sql_modules) :Depuis sys.triggers, je peux récupérer apparemment le nom mais est-il également possible de récupérer le code des triggers en question ?
Et si vous recherchez des triggers serveurs : sys.server_sql_modules
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT OBJECT_NAME(object_id), * FROM sys.sql_modules WHERE OBJECTPROPERTY(object_id, 'IsTrigger') = 1;
En effet, les objets que tu utilises sont des vues de compatibilité dépréciées depuis 2005. Tu trouves la définition dans sys.sql_modules, ou comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT name, OBJECT_DEFINITION(object_id) FROM sys.triggers;
Alors, plutôt que de vous appuyer sur le code des triggers, vous pouvez regarder directement dans la table sys.sql_dependencies :
Mais pourquoi cherchez vous ça ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT name FROM sys.sql_dependencies d INNER JOIN sys.objects o ON o.object_id = d.object_id WHERE referenced_major_id = OBJECT_ID('T_EXPORT_EXP') AND type = 'TR'
Pensez que vous pouvez avoir des triggers appelant des SP (ou des synonymes,...) faisant référence eux même à votre table T_EXPORT_EXP.
Pour être exhaustif, il faudra donc envisager la requête ci-dessus en récursive. (en enlevant le filtre AND type = 'TR', vous aurez déjà un aperçu de tout ce qui fait appel à votre table...)
Non non. C'est juste que je sais que je fais des insertions dans cette table uniquement via des triggers (le pourquoi est compliqué) et vu que les dataflow viennent d'être modifiées, j'dois modifier le moment où j'insère dans la table. Donc je veux être sûr d'avoir bien toute la liste. Car bien sûr, ce n'est pas vraiment documenté... Ce serait trop facile ^^
le norme n' statué sur les déclencheurs qu'à partir de la version 2008.... elle propose SELECT * FROM INFORMATION_SCHEMA.TRIGGERS pas encore implémentée dans SQL Server à ma connaissance !
Pour le code, c'est en principe dans sys.sql_modules...
A +
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT * FROM sys.sql_modules WHERE object_id IN (SELECT object_id FROM sys.triggers)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager