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_id
fonction pour le trouver.
SELECT OBJECT_ID(t.name, t.type) AS object_id, *
FROM sys.triggers AS t;
De même, je peux le trouver dans sys.dm_exec_trigger_stats
. Je ne peux pas object_name
résoudre, mais le object_definition
fait.
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;
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?
sql-server
trigger
metadata
ddl-trigger
Erik Darling
la source
la source
sys.sql_expression_dependencies
-> dereferenced_id
rejoindresys.objects
?parent_id
par bol par exempleobject_id(object_name(parent_id))
Réponses:
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 :Et de même dans les
OBJECTPROPERTYEX()
documents :Les
OBJECT_ID()
documents sont un peu plus explicites:Les
OBJECT_NAME()
documents sont moins explicites, mais ils mentionnent implicitement la même restriction (c'est moi qui souligne):Pour la première requête, vous ne savez pas pourquoi vous devez obtenir le nom via la fonction, car la
name
colonne danssys.triggers
vous donne déjà cette réponse. Pour la deuxième requête, vous pouvez simplement vous joindre àsys.triggers
: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.
la source