IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration SQL Server Discussion :

Où se trouvent les déclencheurs dans le catalogue ? [2008R2]


Sujet :

Administration SQL Server

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut Où se trouvent les déclencheurs dans le catalogue ?
    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 ?

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Pour les triggers DML :
    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'
    ou
    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;
    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.

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    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.

  4. #4
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Voici une solution qui a l'air de fonctionner :
    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%'
    Cela me donne bien tous les triggers ayant un rapport avec la table 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 ?

  5. #5
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    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;
    ++

  6. #6
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2011
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 118
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    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 ?
    La réponse a été donnée par Rudib, il vous faut juste l'adapter suivant votre besoin (sys.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;
    Et si vous recherchez des triggers serveurs : sys.server_sql_modules

  7. #7
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    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;

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    L'idée est d'arriver à identifier les triggers effectuant des ordres sql sur une table précise.
    Alors, plutôt que de vous appuyer sur le code des triggers, vous pouvez regarder directement dans la table sys.sql_dependencies :
    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'
    Mais pourquoi cherchez vous ça ?
    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...)

  9. #9
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    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;
    ++
    Tout simplement parce que je ne connaissais pas .

    Merci à tout le monde donc !

  10. #10
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Alors, plutôt que de vous appuyer sur le code des triggers, vous pouvez regarder directement dans la table sys.sql_dependencies :
    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'
    Mais pourquoi cherchez vous ça ?
    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 ^^

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 899
    Points : 53 140
    Points
    53 140
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par rudib Voir le message
    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.
    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...

    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)
    A +

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Les déclencheurs dans SQLPlus
    Par most27 dans le forum Débuter
    Réponses: 1
    Dernier message: 28/04/2015, 14h13
  2. Réponses: 10
    Dernier message: 20/04/2011, 22h22
  3. Où se trouvent les constructeurs dans la doc?
    Par Amroth dans le forum C++Builder
    Réponses: 6
    Dernier message: 17/04/2009, 09h40
  4. gérer les jpg dans une fenetre directdraw???
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2002, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo