Implementieren von DML-Triggern

Sie sollten Folgendes berücksichtigen, bevor Sie einen DML-Trigger erstellen:

  • Die CREATE TRIGGER-Anweisung muss die erste Anweisung im Batch sein. Alle weiteren Anweisungen, die in diesem Batch folgen, werden als Teil der Definition der CREATE TRIGGER-Anweisung interpretiert.

  • Die Berechtigung zum Erstellen von DML-Triggern liegt standardmäßig beim Tabellenbesitzer, der diese Berechtigung nicht auf andere Benutzer übertragen kann.

  • DML-Trigger sind Datenbankobjekte, und ihre Namen müssen den Regeln für Bezeichner entsprechen.

  • Sie können einen DML-Trigger nur in der aktuellen Datenbank erstellen; er kann jedoch auf Objekte außerhalb der aktuellen Datenbank verweisen.

  • Ein DML-Trigger kann nicht für eine temporäre Tabelle oder eine Systemtabelle erstellt werden; DML-Trigger können jedoch auf temporäre Tabellen verweisen. Auf Systemtabellen sollte nicht verwiesen werden; verwenden Sie stattdessen die Informationsschemasichten.

  • INSTEAD OF DELETE- und INSTEAD OF UPDATE-Trigger können nicht für eine Tabelle definiert werden, für die ein Fremdschlüssel mit einer DELETE- oder UPDATE-Aktion definiert wurde.

  • Obwohl eine TRUNCATE TABLE-Anweisung mit einer DELETE-Anweisung ohne WHERE-Klausel vergleichbar ist (sie löscht alle Zeilen), löst sie keine DELETE-Trigger aus, da die TRUNCATE TABLE-Anweisung nicht protokolliert wird.

  • Die WRITETEXT-Anweisung führt nicht zu einer Auslösung von INSERT- oder UPDATE-Triggern.

Wichtiger HinweisWichtig

Die Möglichkeit, Resultsets aus Triggern zurückzugeben, wird in einer künftigen Version von SQL Server entfernt. Durch Trigger, die Resultsets zurückgeben, kann es in Anwendungen, die hierfür nicht konzipiert wurden, zu unerwartetem Verhalten kommen. Vermeiden Sie deshalb bei Neuentwicklungen, Resultsets aus Triggern zurückzugeben, und planen Sie die Änderung von Anwendungen, in denen dies derzeit verwendet wird. Damit Trigger in SQL Server keine Resultsets zurückgeben, legen Sie disallow results from triggers (Option) auf 1 fest. In einer zukünftigen Version von SQL Server wird die Standardeinstellung für die Option 1 sein.

Beim Erstellen eines DML-Triggers müssen Sie Folgendes angeben:

  • Den Namen.

  • Die Tabelle, für die der Trigger definiert wird.

  • Wann der Trigger ausgelöst werden soll.

  • Die Datenänderungsanweisungen, die den Trigger aktivieren. Zulässige Optionen sind INSERT, UPDATE oder DELETE. Derselbe Trigger kann von mehreren Datenänderungsanweisungen aktiviert werden. Ein Trigger kann z. B. durch ein INSERT- und eine UPDATE-Anweisungen aktiviert werden.

  • Die Programmierungsanweisungen, die die Triggeraktion ausführen.

Mehrere DML-Trigger

Eine Tabelle kann über mehrere AFTER-Trigger eines bestimmten Typs verfügen, vorausgesetzt, die Trigger haben unterschiedliche Namen. Jeder Trigger kann zahlreiche Funktionen ausführen. Jeder Trigger gilt jedoch nur für eine Tabelle, auch wenn ein einziger Trigger für drei beliebige Benutzeraktionen (UPDATE, INSERT und DELETE) gelten kann.

Für eine Tabelle kann nur ein einziger INSTEAD OF-Trigger eines bestimmten Typs definiert werden.

Triggerberechtigungen und -besitz

Trigger werden im Schema der Tabelle oder der Sicht erstellt, für die sie definiert sind. Wenn z. B. der Trigger Trigger1 für die HumanResources.Employee-Tabelle erstellt wird, lautet der schemaqualifizierte Name des Triggers HumanResources.Trigger1.

Die CREATE TRIGGER-Berechtigung liegt standardmäßig beim Besitzer der Tabelle, für die der Trigger definiert ist, bei Mitgliedern der festen Serverrolle sysadmin und bei den Mitgliedern der festen Datenbankrollen db_owner und db_ddladmin und ist nicht übertragbar.

Wird ein INSTEAD OF-Trigger für eine Sicht erstellt, wird die Besitzkette unterbrochen, falls der Besitzer der Sicht nicht gleichzeitig auch die Basistabellen besitzt, auf die die Sicht und der Trigger verweisen. Für eine Basistabelle, die nicht dem Besitzer der Sicht gehört, muss der Tabellenbesitzer allen Benutzern, die die Sicht lesen oder aktualisieren, separat die erforderlichen Berechtigungen gewähren. Falls dieselbe Person Besitzer der Sicht und der zugrunde liegenden Basistabellen ist, müssen anderen Benutzern nur für die Sicht Berechtigungen gewährt werden, nicht für die einzelnen Basistabellen. Weitere Informationen finden Sie unter Besitzketten.

So erstellen Sie einen Trigger