Wie kann ich den Namen eines Datenbank-Triggers mit integrierten Funktionen auflösen?

8

Ich habe einen Datenbank-Trigger , mit dem ich verhindern kann, dass bestimmte Prozeduren in Benutzerdatenbanken erstellt werden.

Es erscheint in sys.triggers, mit einem object_id, aber ich kann die object_idFunktion nicht verwenden , um es zu finden.

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

NÜSSE

Ebenso kann ich es in finden sys.dm_exec_trigger_stats. Ich kann mich nicht object_nameauflösen, object_definitiontut es aber .

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;

NÜSSE

Gibt es eine Funktion, die die Objekt-ID eines Triggers auf Datenbankebene akzeptiert und dessen Namen zurückgibt?

Erik Darling
quelle
Nicht 100% sicher, aber können Sie versuchen sys.sql_expression_dependencies-> referenced_idbeitreten sys.objects?
Kin Shah
@Kin wird nicht in sys> -Objekten oder allen Objekten angezeigt. Ziemlich komisch!
Erik Darling
Das ist interessant .. wie wäre es parent_idlaut bol zBobject_id(object_name(parent_id))
Kin Shah

Antworten:

9

Trigger auf Datenbank- und Serverebene gelten nicht als "Objekte" an sich (aus diesem Grund können Sie sie nicht unter einem Schema erstellen und werden in nicht angezeigt sys.objects).

Sie können sehen, dass diese Objekte bestimmte Einschränkungen aufweisen, z. B. in den OBJECTPROPERTY()Dokumenten :

Diese Funktion kann nicht für Objekte verwendet werden, die keinen Schemabereich haben, z. B. DDL-Trigger (Data Definition Language) und Ereignisbenachrichtigungen.

Und ähnlich in den OBJECTPROPERTYEX()Dokumenten :

OBJECTPROPERTYEX kann nicht für Objekte verwendet werden, die keinen Schemabereich haben, z. B. DDL-Trigger (Data Definition Language) und Ereignisbenachrichtigungen.

Die OBJECT_ID()Dokumente sind etwas expliziter:

Objekte, die keinen Schemabereich haben, wie z. B. DDL-Trigger, können nicht mit OBJECT_ID abgefragt werden. Für Objekte, die nicht in der Katalogansicht sys.objects gefunden werden, erhalten Sie die Objektidentifikationsnummern, indem Sie die entsprechende Katalogansicht abfragen. Verwenden Sie beispielsweise ', um die Objektidentifikationsnummer eines DDL-Triggers zurückzugeben SELECT OBJECT_ID FROM sys.triggers WHERE name = 'DatabaseTriggerLog.

Die OBJECT_NAME()Dokumente sind weniger explizit, erwähnen jedoch implizit dieselbe Einschränkung (Hervorhebung von mir):

Gibt den Datenbankobjektnamen für Objekte mit Schemabereich zurück .


Bei der ersten Abfrage sind Sie sich nicht sicher, warum Sie den Namen über die Funktion abrufen müssen, da die nameSpalte in sys.triggersIhnen diese Antwort bereits gibt. Bei der zweiten Abfrage können Sie einfach beitreten zu 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];

Sie könnten natürlich Ihre eigene Funktion erstellen, aber ich kenne keine integrierten Funktionen, die diese Korrelation für Sie übernehmen (und ich empfehle, sich generell von integrierten Metadatenfunktionen fernzuhalten ).

DDL-Trigger sind eine Art besonderes Tier. Wenn Sie sich also Sorgen machen, dass Sie auch sys.procedures, sys.views usw. beitreten müssen, tun Sie dies nicht.

Aaron Bertrand
quelle
Danke, Aaron. Nein, ich fand es nur seltsam, dass sie sich nicht normal auflösten . Froh , dass seltsames Fleisch hat dich nicht töten;)
Erik Darling