Comment puis-je résoudre le nom d'un déclencheur de base de données avec des fonctions intégrées?

8

J'ai un déclencheur de base de données que j'utilise pour m'empêcher de créer certaines procédures dans les bases de données utilisateur.

Il apparaît dans sys.triggers, avec un object_id, mais je ne peux pas utiliser la object_idfonction pour le trouver.

SELECT OBJECT_ID(t.name, t.type) AS object_id, *
FROM   sys.triggers AS t;

DES NOISETTES

De même, je peux le trouver dans sys.dm_exec_trigger_stats. Je ne peux pas object_namerésoudre, mais le object_definitionfait.

SELECT OBJECT_NAME(dets.object_id, dets.database_id) AS object_name,
       OBJECT_DEFINITION(dets.object_id) AS object_definition,
       *
FROM   sys.dm_exec_trigger_stats AS dets;

DES NOISETTES

Existe-t-il une fonction qui acceptera l'ID d'objet d'un déclencheur de niveau base de données et renverra son nom?

Erik Darling
la source
Pas sûr à 100%, mais pouvez-vous essayer sys.sql_expression_dependencies-> de referenced_idrejoindre sys.objects?
Kin Shah
@Kin il n'apparaît pas dans sys> objets ou tous les objets. Assez bizarre!
Erik Darling
C'est intéressant .. que diriez-vous parent_idpar bol par exempleobject_id(object_name(parent_id))
Kin Shah

Réponses:

9

Les déclencheurs au niveau de la base de données et du serveur ne sont pas considérés comme des "objets" en soi (c'est pourquoi vous ne pouvez pas les créer sous un schéma et pourquoi ils n'apparaissent pas dans sys.objects).

Vous pouvez voir que ces objets ont certaines restrictions, par exemple dans les OBJECTPROPERTY()documents :

Cette fonction ne peut pas être utilisée pour des objets qui ne sont pas limités au schéma, tels que les déclencheurs DDL (Data Definition Language) et les notifications d'événements.

Et de même dans les OBJECTPROPERTYEX()documents :

OBJECTPROPERTYEX ne peut pas être utilisé pour des objets qui ne sont pas à portée de schéma, tels que les déclencheurs DDL (Data Definition Language) et les notifications d'événements.

Les OBJECT_ID()documents sont un peu plus explicites:

Les objets qui ne sont pas limités au schéma, tels que les déclencheurs DDL, ne peuvent pas être interrogés à l'aide de OBJECT_ID. Pour les objets qui ne se trouvent pas dans la vue de catalogue sys.objects, obtenez les numéros d'identification d'objet en interrogeant la vue de catalogue appropriée. Par exemple, pour renvoyer le numéro d'identification d'objet d'un déclencheur DDL, utilisez SELECT OBJECT_ID FROM sys.triggers WHERE name = 'DatabaseTriggerLog'.

Les OBJECT_NAME()documents sont moins explicites, mais ils mentionnent implicitement la même restriction (c'est moi qui souligne):

Renvoie le nom de l'objet de base de données pour les objets à portée de schéma .


Pour la première requête, vous ne savez pas pourquoi vous devez obtenir le nom via la fonction, car la namecolonne dans sys.triggersvous donne déjà cette réponse. Pour la deuxième requête, vous pouvez simplement vous joindre à sys.triggers:

SELECT tr.*, ts.*
FROM sys.dm_exec_trigger_stats AS ts
LEFT OUTER JOIN sys.triggers AS tr
ON ts.[object_id] = tr.[object_id];

Vous pouvez créer votre propre fonction, bien sûr, mais je ne connais aucune fonction intégrée qui fasse cette corrélation pour vous (et je recommande de rester loin des fonctions de métadonnées intégrées en général de toute façon ).

Les déclencheurs DDL sont une sorte d'animal spécial. Donc, si vous avez peur de devoir également vous inscrire à sys.procedures, sys.views, etc., ne le faites pas.

Aaron Bertrand
la source
Merci, Aaron. Non, j'ai juste trouvé étrange qu'ils ne se résolvent pas normalement . Heureux que la viande bizarre ne vous ait pas tué;)
Erik Darling