Angenommen, Sie möchten eine Datenbank abfragen, um die darin enthaltenen Auslösertypen zu ermitteln. Eine Möglichkeit, dies zu tun, besteht darin, die Funktion OBJECTPROPERTY für alle Triggerobjekte in der Datenbank zu verwenden.
Manchmal führt die Funktion OBJECTPROPERTY zu einem verwirrenden Ergebnis. Die Ausgabe scheint vom Datenbankkontext abzuhängen.
Die folgende Beispielabfrage gibt eine Zeile für jeden der Sysmail-Trigger in msdb zurück:
SELECT
object_id,
name,
OBJECTPROPERTY(object_id, 'ExecIsInsertTrigger') AS IsInsertTrigger,
OBJECTPROPERTY(object_id, 'ExecIsUpdateTrigger') AS IsUpdateTrigger,
OBJECTPROPERTY(object_id, 'ExecIsDeleteTrigger') AS IsDeleteTrigger
FROM msdb.sys.objects
WHERE
[type] = 'TR' AND
name LIKE 'trig_sysmail_%';
GO
Die Absicht ist herauszufinden, welche DML-Aktion jeden Trigger auslöst. Beispielsweise IsInsertTrigger
enthält die Spalte eine 1, wenn der Trigger definiert ist AFTER INSERT
, und andernfalls eine 0.
Wenn ich die Abfrage im Kontext von msdb ausführe, enthält die Ergebnismenge in jeder der berechneten Spalten eine 0 oder eine 1. Es sieht aus wie das:
object_id name IsInsertTrigger IsUpdateTrigger IsDeleteTrigger
----------- ---------------------------- --------------- --------------- ---------------
713105631 trig_sysmail_profile 0 1 0
745105745 trig_sysmail_account 0 1 0
761105802 trig_sysmail_profileaccount 0 1 0
777105859 trig_sysmail_profile_delete 0 0 1
793105916 trig_sysmail_servertype 0 1 0
809105973 trig_sysmail_server 0 1 0
825106030 trig_sysmail_configuration 0 1 0
841106087 trig_sysmail_mailitems 0 1 0
857106144 trig_sysmail_attachments 0 1 0
873106201 trig_sysmail_log 0 1 0
Wenn ich die Abfrage im Kontext des Masters ausführe, enthält die Ergebnismenge in jeder der berechneten Spalten NULL. Es sieht aus wie das:
object_id name IsInsertTrigger IsUpdateTrigger IsDeleteTrigger
----------- ---------------------------- --------------- --------------- ---------------
713105631 trig_sysmail_profile NULL NULL NULL
745105745 trig_sysmail_account NULL NULL NULL
761105802 trig_sysmail_profileaccount NULL NULL NULL
777105859 trig_sysmail_profile_delete NULL NULL NULL
793105916 trig_sysmail_servertype NULL NULL NULL
809105973 trig_sysmail_server NULL NULL NULL
825106030 trig_sysmail_configuration NULL NULL NULL
841106087 trig_sysmail_mailitems NULL NULL NULL
857106144 trig_sysmail_attachments NULL NULL NULL
873106201 trig_sysmail_log NULL NULL NULL
MSDN stellt fest, dass die Funktion OBJECTPROPERTY NULL zurückgibt, wenn:
- Der Eigenschaftsname ist ungültig.
- Die Objekt-ID ist ungültig.
- id ist ein nicht unterstützter Objekttyp für die angegebene Eigenschaft.
- Der Aufrufer hat keine Berechtigung zum Anzeigen der Metadaten des Objekts.
Ich kann die Gründe 1 und 3 ausschließen, da die Abfrage im Kontext von msdb das richtige Ergebnis zurückgibt.
Zuerst dachte ich, es könnte sich um ein datenbankübergreifendes Berechtigungsproblem handeln (Grund 4), aber ich bin Systemadministrator auf dem Server.
Damit bleibt Grund 2, der mich mit folgenden Fragen zurücklässt:
Ist die Objekt-ID in einer datenbankübergreifenden Abfrage ungültig?
Welche OBJECTPROPERTY-Funktion der Datenbank wird aufgerufen?
quelle
Wie von gbn angegeben, müssen Sie diese Abfrage im Kontext der msdb-Datenbank ausführen
OBJECTPROPERTY
, um sie korrekt aufzulösen. Wenn Sie Ihre Skriptdatenbank agnostisch machen möchten, können Sie eine kompliziertere Abfrage schreiben, um dieselben Informationen zu erhalten:quelle
sys.trigger_events
. Die Dokumentation fürsys.triggers
erwähnt es nicht, aber es ist eindeutig verwandt.