CREATE TRIGGER (Transact-SQL)CREATE TRIGGER (Transact-SQL)

DIESES THEMA GILT FÜR:jaSQL Server (ab 2008)jaAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Erstellt einen DML-, DDL- oder LOGON-Trigger.Creates a DML, DDL, or logon trigger. Ein Trigger ist eine spezielle Art von gespeicherter Prozedur, die automatisch ausgeführt wird, wenn ein Ereignis auf dem Datenbankserver auftritt.A trigger is a special type of stored procedure that automatically executes when an event occurs in the database server. DML-Trigger werden ausgeführt, wenn ein Benutzer versucht, Daten mithilfe eines DML-Ereignisses (Data Manipulation Language, Datenbearbeitungssprache) zu ändern.DML triggers execute when a user tries to modify data through a data manipulation language (DML) event. DML-Ereignisse sind INSERT-, UPDATE- oder DELETE-Anweisungen für eine Tabelle oder Sicht.DML events are INSERT, UPDATE, or DELETE statements on a table or view. Diese Trigger werden ausgelöst, sobald ein beliebiges gültiges Ereignis ausgelöst wird, unabhängig davon, ob Tabellenzeilen betroffen sind oder nicht.These triggers fire when any valid event is fired, regardless of whether or not any table rows are affected. Weitere Informationen finden Sie unter DML Triggers.For more information, see DML Triggers.

DDL-Trigger werden als Reaktion auf verschiedene DDL-Ereignisse (Data Definition Language, Datendefinitionssprache) ausgeführt.DDL triggers execute in response to a variety of data definition language (DDL) events. Diese Ereignisse entsprechen im Wesentlichen den Anweisungen CREATE, ALTER und DROP von Transact-SQLTransact-SQL sowie bestimmten gespeicherten Systemprozeduren, die DDL-ähnliche Vorgänge ausführen.These events primarily correspond to Transact-SQLTransact-SQL CREATE, ALTER, and DROP statements, and certain system stored procedures that perform DDL-like operations. LOGON-Trigger werden als Reaktion auf das LOGON-Ereignis ausgelöst, das wiederum ausgelöst wird, wenn eine Benutzersitzung eingerichtet wird.Logon triggers fire in response to the LOGON event that is raised when a user's session is being established. Trigger können direkt aus Transact-SQLTransact-SQL-Anweisungen oder aus Methoden von Assemblys erstellt werden, die in der MicrosoftMicrosoft .NET Framework.NET Framework Common Language Runtime (CLR) erstellt und auf eine Instanz von SQL ServerSQL Server hochgeladen werden.Triggers can be created directly from Transact-SQLTransact-SQL statements or from methods of assemblies that are created in the MicrosoftMicrosoft .NET Framework.NET Framework common language runtime (CLR) and uploaded to an instance of SQL ServerSQL Server. SQL ServerSQL Server ermöglicht das Erstellen mehrerer Trigger für jede konkrete Anweisung. allows for creating multiple triggers for any specific statement.

Wichtig

Bösartiger Code innerhalb von Triggern kann unter ausgeweiteten Privilegien ausgeführt werden.Malicious code inside triggers can run under escalated privileges. Weitere Informationen dazu, wie Sie diese Bedrohung minimieren, finden Sie unter Verwalten der Triggersicherheit.For more information on how to mitigate this threat, see Manage Trigger Security.

Hinweis

Die Integration der .NET Framework-CLR in SQL Server wird in diesem Thema erläutert.The integration of .NET Framework CLR into SQL Server is discussed in this topic. Die Integration der CLR gilt nicht für Azure SQL-Datenbank.CLR integration does not apply to Azure SQL Database.

Themenlinksymbol Transact-SQL Syntax Conventions (Transact-SQL-Syntaxkonventionen)Topic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

-- SQL Server Syntax  
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)  

CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table | view }   
[ WITH <dml_trigger_option> [ ,...n ] ]  
{ FOR | AFTER | INSTEAD OF }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
[ WITH APPEND ]  
[ NOT FOR REPLICATION ]   
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }  

<dml_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  

<method_specifier> ::=  
    assembly_name.class_name.method_name  
-- SQL Server Syntax  
-- Trigger on an INSERT, UPDATE, or DELETE statement to a 
-- table (DML Trigger on memory-optimized tables)  

CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table }   
[ WITH <dml_trigger_option> [ ,...n ] ]  
{ FOR | AFTER }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
AS { sql_statement  [ ; ] [ ,...n ] }  

<dml_trigger_option> ::=  
    [ NATIVE_COMPILATION ]  
    [ SCHEMABINDING ]  
    [ EXECUTE AS Clause ]  
-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, 
-- REVOKE or UPDATE statement (DDL Trigger)  

CREATE [ OR ALTER ] TRIGGER trigger_name   
ON { ALL SERVER | DATABASE }   
[ WITH <ddl_trigger_option> [ ,...n ] ]  
{ FOR | AFTER } { event_type | event_group } [ ,...n ]  
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  

<ddl_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  
-- Trigger on a LOGON event (Logon Trigger)  

CREATE [ OR ALTER ] TRIGGER trigger_name   
ON ALL SERVER   
[ WITH <logon_trigger_option> [ ,...n ] ]  
{ FOR| AFTER } LOGON    
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  

<logon_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  

SyntaxSyntax

-- Windows Azure SQL Database Syntax   
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)  

CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table | view }   
 [ WITH <dml_trigger_option> [ ,...n ] ]   
{ FOR | AFTER | INSTEAD OF }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
  AS { sql_statement  [ ; ] [ ,...n ] [ ; ] > }  

<dml_trigger_option> ::=   
        [ EXECUTE AS Clause ]  
-- Windows Azure SQL Database Syntax  
-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, 
-- REVOKE, or UPDATE STATISTICS statement (DDL Trigger)   

CREATE [ OR ALTER ] TRIGGER trigger_name   
ON { DATABASE }   
 [ WITH <ddl_trigger_option> [ ,...n ] ]   
{ FOR | AFTER } { event_type | event_group } [ ,...n ]   
AS { sql_statement  [ ; ] [ ,...n ]  [ ; ] }  

<ddl_trigger_option> ::=   
    [ EXECUTE AS Clause ]  

ArgumenteArguments

OR ALTEROR ALTER
Gilt für: Azure SQL-DatenbankSQL Database, SQL ServerSQL Server (ab SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).Applies to: Azure SQL-DatenbankSQL Database, SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).

Ändert den Trigger nur, wenn dieser bereits vorhanden ist.Conditionally alters the trigger only if it already exists.

schema_nameschema_name
Der Name des Schemas, zu dem ein DML-Trigger gehört.Is the name of the schema to which a DML trigger belongs. DML-Trigger werden auf das Schema der Tabelle oder der Sicht begrenzt, in denen sie erstellt werden.DML triggers are scoped to the schema of the table or view on which they are created. schema_name kann für DDL- oder LOGON-Trigger nicht angegeben werden.schema_name cannot be specified for DDL or logon triggers.

trigger_nametrigger_name
Der Name des Triggers.Is the name of the trigger. Ein trigger_name muss den Regeln für Bezeichner entsprechen, und trigger_name darf nicht mit # oder ## beginnen.A trigger_name must comply with the rules for identifiers, except that trigger_name cannot start with # or ##.

table | viewtable | view
Die Tabelle oder Sicht, für die der DML-Trigger ausgeführt wird; zuweilen wird diese als Triggertabelle oder Triggersicht bezeichnet.Is the table or view on which the DML trigger is executed and is sometimes referred to as the trigger table or trigger view. Die Angabe des vollqualifizierten Namens der Tabelle oder Sicht ist optional.Specifying the fully qualified name of the table or view is optional. Auf eine Sicht kann nur von einem INSTEAD OF-Trigger verwiesen werden.A view can be referenced only by an INSTEAD OF trigger. DML-Trigger können nicht für lokale oder globale temporäre Tabellen definiert werden.DML triggers cannot be defined on local or global temporary tables.

DATABASEDATABASE
Wendet den Bereich eines DDL-Triggers auf die aktuelle Datenbank an.Applies the scope of a DDL trigger to the current database. Wenn angegeben, wird der Trigger jedes Mal ausgelöst, wenn in der aktuellen Datenbank event_type oder event_group auftritt.If specified, the trigger fires whenever event_type or event_group occurs in the current database.

ALL SERVERALL SERVER
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Wendet den Bereich eines DDL- oder LOGON-Triggers auf den aktuellen Server an.Applies the scope of a DDL or logon trigger to the current server. Wenn angegeben, wird der Trigger jedes Mal ausgelöst, wenn auf dem aktuellen Server event_type oder event_group auftritt.If specified, the trigger fires whenever event_type or event_group occurs anywhere in the current server.

WITH ENCRYPTIONWITH ENCRYPTION
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Verbirgt den Text der CREATE TRIGGER-Anweisung.Obfuscates the text of the CREATE TRIGGER statement. Durch das Verwenden von WITH ENCRYPTION kann verhindert werden, dass der Trigger als Teil der SQL ServerSQL Server-Replikation veröffentlicht wird.Using WITH ENCRYPTION prevents the trigger from being published as part of SQL ServerSQL Server replication. WITH ENCRYPTION kann nicht für CLR-Trigger angegeben werden.WITH ENCRYPTION cannot be specified for CLR triggers.

EXECUTE ASEXECUTE AS
Gibt den Sicherheitskontext an, unter dem der Trigger ausgeführt wird.Specifies the security context under which the trigger is executed. Sie können steuern, welches Benutzerkonto die Instanz von SQL ServerSQL Server verwendet, um so die Berechtigungen für beliebige Datenbankobjekte zu überprüfen, auf die der Trigger verweist.Enables you to control which user account the instance of SQL ServerSQL Server uses to validate permissions on any database objects that are referenced by the trigger.

Diese Option ist für Trigger in speicheroptimierten Tabellen erforderlich.This option is required for triggers on memory-optimized tables.

Weitere Informationen finden Sie unter EXECUTE AS-Klausel ( Transact-SQL ) .For more information, seeEXECUTE AS Clause (Transact-SQL).

NATIVE_COMPILATIONNATIVE_COMPILATION
Gibt an, dass die Trigger nativ kompiliert werden.Indicates that the trigger is natively compiled.

Diese Option ist für Trigger in speicheroptimierten Tabellen erforderlich.This option is required for triggers on memory-optimized tables.

SCHEMABINDINGSCHEMABINDING
Stellt sicher, dass Tabellen, auf die durch einen Trigger verwiesen wird, nicht gelöscht oder geändert werden können.Ensures that tables that are referenced by a trigger cannot be dropped or altered.

Diese Option ist für Trigger in speicheroptimierten Tabellen erforderlich und wird nicht für Trigger in herkömmlichen Tabellen unterstützt.This option is required for triggers on memory-optimized tables and is not supported for triggers on traditional tables.

FOR | AFTERFOR | AFTER
AFTER gibt an, dass der DML-Trigger nur dann ausgelöst wird, nachdem alle Vorgänge, die in der den Trigger auslösenden SQL-Anweisung festgelegt sind, erfolgreich ausgeführt wurden.AFTER specifies that the DML trigger is fired only when all operations specified in the triggering SQL statement have executed successfully. Alle referenziellen CASCADE-Aktionen und Einschränkungsüberprüfungen müssen ebenfalls erfolgreich ausgeführt worden sein, bevor dieser Trigger ausgelöst wird.All referential cascade actions and constraint checks also must succeed before this trigger fires.

AFTER ist die Standardeinstellung, wenn FOR das einzige angegebene Schlüsselwort ist.AFTER is the default when FOR is the only keyword specified.

AFTER-Trigger können für Sichten nicht definiert werden.AFTER triggers cannot be defined on views.

INSTEAD OFINSTEAD OF
Gibt an, dass der DML-Trigger anstelle der auslösenden SQL-Anweisung ausgeführt wird, wodurch die Aktionen der auslösenden Anweisungen überschrieben werden.Specifies that the DML trigger is executed instead of the triggering SQL statement, therefore, overriding the actions of the triggering statements. INSTEAD OF kann für DDL- oder LOGON-Trigger nicht angegeben werden.INSTEAD OF cannot be specified for DDL or logon triggers.

Es kann nur maximal ein INSTEAD OF-Trigger pro INSERT-, UPDATE- oder DELETE-Anweisung für eine Tabelle oder Sicht definiert werden.At most, one INSTEAD OF trigger per INSERT, UPDATE, or DELETE statement can be defined on a table or view. Es ist jedoch möglich, Sichten auf Sichten zu definieren, wobei jede Sicht über einen eigenen INSTEAD OF-Trigger verfügt.However, you can define views on views where each view has its own INSTEAD OF trigger.

INSTEAD OF-Trigger sind für aktualisierbare Sichten, die WITH CHECK OPTION verwenden, nicht zulässig.INSTEAD OF triggers are not allowed on updatable views that use WITH CHECK OPTION. SQL ServerSQL Server löst einen Fehler aus, falls ein INSTEAD OF-Trigger zu einer aktualisierbaren Sicht hinzugefügt wird, in der WITH CHECK OPTION angegeben ist. raises an error when an INSTEAD OF trigger is added to an updatable view WITH CHECK OPTION specified. Der Benutzer muss die Option mithilfe von ALTER VIEW entfernen, bevor der INSTEAD OF-Trigger definiert werden kann.The user must remove that option by using ALTER VIEW before defining the INSTEAD OF trigger.

{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
Gibt die Anweisungen zur Datenänderung an, die den DML-Trigger aktivieren, wenn Sie ihn für diese Tabelle oder Sicht auszuführen versuchen.Specifies the data modification statements that activate the DML trigger when it is tried against this table or view. Es muss mindestens eine Option angegeben werden.At least one option must be specified. Diese Optionen können in beliebiger Kombination und Reihenfolge in der Triggerdefinition angegeben werden.Any combination of these options in any order is allowed in the trigger definition.

Für INSTEAD OF-Trigger ist die Option DELETE nicht für Tabellen mit einer referenziellen Beziehung untereinander zulässig, wenn für ON DELETE die Option CASCADE angegeben ist.For INSTEAD OF triggers, the DELETE option is not allowed on tables that have a referential relationship specifying a cascade action ON DELETE. Ebenso ist die Option UPDATE nicht für Tabellen mit einer referenziellen Beziehung untereinander zulässig, wenn für ON UPDATE die Option CASCADE angegeben ist.Similarly, the UPDATE option is not allowed on tables that have a referential relationship specifying a cascade action ON UPDATE.

WITH APPENDWITH APPEND
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2008 R2SQL Server 2008 R2.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2008 R2SQL Server 2008 R2.

Gibt an, dass ein weiterer Trigger eines vorhandenen Typs hinzugefügt werden soll.Specifies that an additional trigger of an existing type should be added. WITH APPEND kann nicht mit INSTEAD OF-Triggern verwendet werden oder falls der AFTER-Trigger explizit angegeben ist.WITH APPEND cannot be used with INSTEAD OF triggers or if AFTER trigger is explicitly stated. Aus Gründen der Abwärtskompatibilität kann WITH APPEND nur verwendet werden, wenn FOR angegeben ist, INSTEAD OF oder AFTER jedoch nicht.WITH APPEND can be used only when FOR is specified, without INSTEAD OF or AFTER, for backward compatibility reasons. WITH APPEND kann nicht angegeben werden, wenn EXTERNAL NAME angegeben ist (wenn es sich bei dem Trigger also um einen CLR-Trigger handelt).WITH APPEND cannot be specified if EXTERNAL NAME is specified (that is, if the trigger is a CLR trigger).

event_typeevent_type
Der Name eines Transact-SQLTransact-SQL-Sprachereignisses, nach dessen Ausführung ein DDL-Trigger ausgelöst wird.Is the name of a Transact-SQLTransact-SQL language event that, after execution, causes a DDL trigger to fire. Gültige Ereignisse für DDL-Trigger werden unter DDL-Ereignisse aufgeführt.Valid events for DDL triggers are listed in DDL Events.

event_groupevent_group
Der Name einer vordefinierten Gruppe von Transact-SQLTransact-SQL-Sprachereignissen.Is the name of a predefined grouping of Transact-SQLTransact-SQL language events. Der DDL-Trigger wird nach dem Ausführen eines beliebigen Transact-SQLTransact-SQL-Sprachereignisses ausgelöst, das zu event_group gehört.The DDL trigger fires after execution of any Transact-SQLTransact-SQL language event that belongs to event_group. Gültige Ereignisgruppen für DDL-Trigger werden unter DDL-Ereignisgruppen aufgeführt.Valid event groups for DDL triggers are listed in DDL Event Groups.

Nach dem Ausführen von CREATE TRIGGER dient event_group außerdem als Makro, das der sys.trigger_events-Katalogsicht die verarbeitbaren Ereignistypen hinzufügt.After the CREATE TRIGGER has finished running, event_group also acts as a macro by adding the event types it covers to the sys.trigger_events catalog view.

NOT FOR REPLICATIONNOT FOR REPLICATION
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Gibt an, dass der Trigger nicht ausgeführt werden soll, wenn ein Replikations-Agent die vom Trigger betroffene Tabelle ändert.Indicates that the trigger should not be executed when a replication agent modifies the table that is involved in the trigger.

sql_statementsql_statement
Die Triggerbedingungen und -aktionen.Is the trigger conditions and actions. Triggerbedingungen geben zusätzliche Kriterien an, die bestimmen, ob der Versuch, DML-, DDL- oder LOGON-Ereignisse auszulösen, die Triggeraktionen auslöst.Trigger conditions specify additional criteria that determine whether the tried DML, DDL, or logon events cause the trigger actions to be performed.

Die in den Transact-SQLTransact-SQL-Anweisungen angegebenen Triggeraktionen treten in Kraft, wenn versucht wird, den Vorgang auszuführen.The trigger actions specified in the Transact-SQLTransact-SQL statements go into effect when the operation is tried.

Trigger können beliebig viele Transact-SQLTransact-SQL-Anweisungen jeglicher Art enthalten, einschließlich Ausnahmen.Triggers can include any number and type of Transact-SQLTransact-SQL statements, with exceptions. Weitere Informationen finden Sie in den Hinweisen.For more information, see Remarks. Ein Trigger ist dafür konzipiert, Daten auf der Grundlage einer Datenänderungs- oder Definitionsanweisung zu prüfen oder zu ändern, jedoch nicht dafür, Daten an den Benutzer zurückzugeben.A trigger is designed to check or change data based on a data modification or definition statement; it should not return data to the user. Die Transact-SQLTransact-SQL-Anweisungen in einem Trigger enthalten häufig Sprachkonstrukte zur Ablaufsteuerung.The Transact-SQLTransact-SQL statements in a trigger frequently include control-of-flow language.

DML-Trigger verwenden die gelöschten und eingefügten logischen (konzeptionellen) Tabellen.DML triggers use the deleted and inserted logical (conceptual) tables. Strukturell ähneln sie der Tabelle, für die der Trigger definiert wurde, d. h. der Tabelle, für die versucht wurde, die Benutzeraktion auszuführen.They are structurally similar to the table on which the trigger is defined, that is, the table on which the user action is tried. Die gelöschten und eingefügten Tabellen enthalten die alten oder die neuen Werte der Zeilen, die möglicherweise durch die Benutzeraktion geändert werden.The deleted and inserted tables hold the old values or new values of the rows that may be changed by the user action. Um beispielsweise alle Werte in der deleted-Tabelle abzurufen, verwenden Sie:For example, to retrieve all values in the deleted table, use:

SELECT * FROM deleted;  

Weitere Informationen finden Sie unter Verwenden der Tabellen „inserted“ und „deleted“.For more information, see Use the inserted and deleted Tables.

DDL- und LOGON-Trigger zeichnen Informationen zu dem auslösenden Ereignis auf, indem sie die Funktion EVENTDATA (Transact-SQL) verwenden.DDL and logon triggers capture information about the triggering event by using the EVENTDATA (Transact-SQL) function. Weitere Informationen finden Sie unter Verwenden der EVENTDATA-Funktion.For more information, see Use the EVENTDATA Function.

SQL ServerSQL Server ermöglicht das Aktualisieren der Spalten text, ntext oder image mithilfe des INSTEAD OF-Triggers für Tabellen oder Sichten. allows for the update of text, ntext, or image columns through the INSTEAD OF trigger on tables or views.

Wichtig

Die Datentypen ntext, text und image werden in einer zukünftigen Version von MicrosoftMicrosoft SQL ServerSQL Server entfernt.ntext, text, and image data types will be removed in a future version of MicrosoftMicrosoft SQL ServerSQL Server. Vermeiden Sie die Verwendung dieser Datentypen bei neuen Entwicklungen, und planen Sie die Änderung von Anwendungen, in denen sie aktuell verwendet werden.Avoid using these data types in new development work, and plan to modify applications that currently use them. Verwenden Sie stattdessen nvarchar(max), varchar(max)und varbinary(max) .Use nvarchar(max), varchar(max), and varbinary(max) instead. Die Trigger AFTER und INSTEAD OF unterstützen die Daten varchar(max), nvarchar(max) und varbinary(max) in den Tabellen „inserted“ und „deleted“.Both AFTER and INSTEAD OF triggers support varchar(MAX), nvarchar(MAX), and varbinary(MAX) data in the inserted and deleted tables.

Bei Triggern in speicheroptimierten Tabellen ist auf der obersten Ebene nur ein ATOMIC-Block als sql_statement erlaubt.For triggers on memory-optimized tables, the only sql_statement allowed at the top level is an ATOMIC block. Das im ATOMIC-Block erlaubte T-SQL ist durch das in nativen Prozeduren zulässige T-SQL beschränkt.The T-SQL allowed inside the ATOMIC block is limited by the T-SQL allowed inside native procs.

< method_specifier > Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.< method_specifier > Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Gibt für einen CLR-Trigger die Methode einer Assembly an, die an den Trigger gebunden werden soll.For a CLR trigger, specifies the method of an assembly to bind with the trigger. Die Methode darf keine Argumente enthalten und muss "void" zurückgeben.The method must take no arguments and return void. class_name muss ein gültiger SQL ServerSQL Server-Bezeichner sein und als Klasse mit Assemblysichtbarkeit in der Assembly vorhanden sein.class_name must be a valid SQL ServerSQL Server identifier and must exist as a class in the assembly with assembly visibility. Wenn die Klasse über einen mit einem Namespace qualifizierten Namen verfügt, der '.' verwendet, um die einzelnen Bestandteile des Namespace voneinander zu trennen, muss im Klassennamen [ ] oder " " als Trennzeichen verwendet werden.If the class has a namespace-qualified name that uses '.' to separate namespace parts, the class name must be delimited by using [ ] or " " delimiters. Bei der Klasse darf es sich nicht um eine geschachtelte Klasse handeln.The class cannot be a nested class.

Hinweis

Standardmäßig ist die Möglichkeit, dass SQL ServerSQL Server CLR-Code ausführt, deaktiviert.By default, the ability of SQL ServerSQL Server to run CLR code is off. Sie können Datenbankobjekte erstellen, die auf verwaltete Codemodule verweisen, ändern und löschen. Diese Verweise werden jedoch nur dann in einer Instanz von SQL ServerSQL Server ausgeführt, wenn die Option clr enabled mithilfe von sp_configure aktiviert wird.You can create, modify, and drop database objects that reference managed code modules, but these references will not execute in an instance of SQL ServerSQL Server unless the clr enabled Option is enabled by using sp_configure.

Hinweise zu DML-TriggernRemarks for DML Triggers

DML-Trigger werden häufig zum Erzwingen von Geschäftsregeln und Datenintegrität verwendet.DML triggers are frequently used for enforcing business rules and data integrity. SQL ServerSQL Server bietet deklarative referenzielle Integrität (DRI) durch die ALTER TABLE- und CREATE TABLE-Anweisungen. provides declarative referential integrity (DRI) through the ALTER TABLE and CREATE TABLE statements. DRI stellt jedoch keine datenbankübergreifende referenzielle Integrität sicher.However, DRI does not provide cross-database referential integrity. Referenzielle Integrität bezieht sich auf die Regeln über die Beziehungen zwischen den Primär- und den Fremdschlüsseln von Tabellen.Referential integrity refers to the rules about the relationships between the primary and foreign keys of tables. Um referenzielle Integrität zu erzwingen, verwenden Sie die PRIMARY KEY- und FOREIGN KEY-Einschränkungen in ALTER TABLE und CREATE TABLE.To enforce referential integrity, use the PRIMARY KEY and FOREIGN KEY constraints in ALTER TABLE and CREATE TABLE. Wenn es für die Triggertabelle Einschränkungen gibt, werden diese geprüft, nachdem der INSTEAD OF-Trigger ausgeführt wurde und bevor der AFTER-Trigger ausgeführt wird.If constraints exist on the trigger table, they are checked after the INSTEAD OF trigger execution and before the AFTER trigger execution. Falls eine Verletzung der Einschränkungen vorliegt, wird für die Aktionen des INSTEAD OF-Triggers ein Rollback ausgeführt. Der AFTER-Trigger wird nicht ausgelöst.If the constraints are violated, the INSTEAD OF trigger actions are rolled back and the AFTER trigger is not fired.

Der erste und der letzte AFTER-Trigger, die für eine Tabelle ausgeführt werden sollen, können mithilfe von sp_settriggerorder angegeben werden.The first and last AFTER triggers to be executed on a table can be specified by using sp_settriggerorder. In einer Tabelle kann für jeden INSERT-, UPDATE- und DELETE-Vorgang nur ein erster und ein letzter AFTER-Trigger angegeben werden.Only one first and one last AFTER trigger for each INSERT, UPDATE, and DELETE operation can be specified on a table. Sind für eine Tabelle weitere AFTER-Trigger vorhanden, werden diese nach dem Zufallsprinzip ausgeführt.If there are other AFTER triggers on the same table, they are randomly executed.

Wenn eine ALTER TRIGGER-Anweisung den ersten oder den letzten Trigger ändert, wird das erste oder das letzte für den geänderten Trigger festgelegte Attribut gelöscht, und der Reihenfolgewert muss mithilfe von sp_settriggerorder neu festgelegt werden.If an ALTER TRIGGER statement changes a first or last trigger, the first or last attribute set on the modified trigger is dropped, and the order value must be reset by using sp_settriggerorder.

Ein AFTER-Trigger wird nur dann ausgeführt, wenn die den Trigger auslösende SQL-Anweisung erfolgreich ausgeführt wurde.An AFTER trigger is executed only after the triggering SQL statement has executed successfully. Diese erfolgreiche Ausführung umfasst alle referenziellen kaskadierenden Aktionen und Einschränkungsüberprüfungen, die mit dem aktualisierten oder gelöschten Objekt verknüpft sind.This successful execution includes all referential cascade actions and constraint checks associated with the object updated or deleted. Ein AFTER-Trigger löst nicht rekursiv einen INSTEAD OF-Trigger für dieselbe Tabelle aus.An AFTER trigger will not recursively fire an INSTEAD OF trigger on the same table.

Falls ein für eine Tabelle definierter INSTEAD OF-Trigger eine Anweisung für die Tabelle ausführt, die normalerweise den INSTEAD OF-Trigger erneut auslösen würde, wird der Trigger nicht erneut aufgerufen.If an INSTEAD OF trigger defined on a table executes a statement against the table that would ordinarily fire the INSTEAD OF trigger again, the trigger is not called recursively. Stattdessen wird die Anweisung so verarbeitet, als ob in der Tabelle kein INSTEAD OF-Trigger vorhanden wäre, und die Kette der Einschränkungsvorgänge und AFTER-Triggerausführungen wird gestartet.Instead, the statement is processed as if the table had no INSTEAD OF trigger and starts the chain of constraint operations and AFTER trigger executions. Wenn z. B. ein Trigger als INSTEAD OF INSERT-Trigger für eine Tabelle definiert ist und der Trigger eine INSERT-Anweisung in derselben Tabelle ausführt, ruft die durch den INSTEAD OF-Trigger ausgeführte INSERT-Anweisung den Trigger nicht erneut auf.For example, if a trigger is defined as an INSTEAD OF INSERT trigger for a table, and the trigger executes an INSERT statement on the same table, the INSERT statement executed by the INSTEAD OF trigger does not call the trigger again. Die INSERT-Anweisung, die durch den Trigger ausgeführt wird, startet das Ausführen der Einschränkungsaktionen und löst alle für die Tabelle definierten AFTER INSERT-Trigger aus.The INSERT executed by the trigger starts the process of performing constraint actions and firing any AFTER INSERT triggers defined for the table.

Falls ein für eine Sicht definierter INSTEAD OF-Trigger eine Anweisung für die Sicht ausführt, die normalerweise den INSTEAD OF-Trigger erneut auslösen würde, wird der Trigger nicht erneut aufgerufen.If an INSTEAD OF trigger defined on a view executes a statement against the view that would ordinarily fire the INSTEAD OF trigger again, it is not called recursively. Stattdessen wird die Anweisung als Änderungen an den zugrunde liegenden Basistabellen der Sicht aufgelöst.Instead, the statement is resolved as modifications against the base tables underlying the view. In diesem Fall muss die Sichtdefinition alle Einschränkungen für eine aktualisierbare Sicht erfüllen.In this case, the view definition must meet all the restrictions for an updatable view. Eine Definition zu aktualisierbaren Sichten finden Sie unter Modify Data Through a View (Ändern von Daten über eine Sicht).For a definition of updatable views, see Modify Data Through a View.

Wenn z. B. ein Trigger als INSTEAD OF UPDATE-Trigger für eine Sicht definiert ist und der Trigger eine UPDATE-Anweisung in derselben Sicht ausführt, ruft die durch den INSTEAD OF-Trigger ausgeführte UPDATE-Anweisung den Trigger nicht erneut auf.For example, if a trigger is defined as an INSTEAD OF UPDATE trigger for a view, and the trigger executes an UPDATE statement referencing the same view, the UPDATE statement executed by the INSTEAD OF trigger does not call the trigger again. Die von dem Trigger ausgeführte UPDATE-Anweisung wird für die Sicht so verarbeitet, als ob in der Sicht kein INSTEAD OF-Trigger vorhanden wäre.The UPDATE executed by the trigger is processed against the view as if the view did not have an INSTEAD OF trigger. Die von der UPDATE-Anweisung geänderten Spalten müssen in eine einzige Basistabelle aufgelöst werden.The columns changed by the UPDATE must be resolved to a single base table. Jede Änderung an einer zugrunde liegenden Basistabelle startet die Kette der definierten Einschränkungen und löst die für die Tabelle definierten AFTER-Trigger aus.Each modification to an underlying base table starts the chain of applying constraints and firing AFTER triggers defined for the table.

Testen auf UPDATE- oder INSERT-Aktionen in angegebenen SpaltenTesting for UPDATE or INSERT Actions to Specific Columns

Sie können einen Transact-SQLTransact-SQL-Trigger erstellen, der auf der Grundlage von UPDATE- oder INSERT-Änderungen an den angegebenen Spalten bestimmte Aktionen ausführt.You can design a Transact-SQLTransact-SQL trigger to perform certain actions based on UPDATE or INSERT modifications to specific columns. Verwenden Sie hierzu UPDATE() oder COLUMNS_UPDATED innerhalb des Triggertexts.Use UPDATE() or COLUMNS_UPDATED in the body of the trigger for this purpose. UPDATE() testet auf UPDATE- oder INSERT-Versuche in einer Spalte.UPDATE() tests for UPDATE or INSERT attempts on one column. COLUMNS_UPDATED testet auf UPDATE- oder INSERT-Aktionen, die für mehrere Spalten durchgeführt wurden, und gibt ein Bitmuster zurück, dem Sie entnehmen können, welche Spalten eingefügt oder aktualisiert wurden.COLUMNS_UPDATED tests for UPDATE or INSERT actions that are performed on multiple columns and returns a bit pattern that indicates which columns were inserted or updated.

Beschränkungen bei der Verwendung von TriggernTrigger Limitations

CREATE TRIGGER muss die erste Anweisung in einem Batch sein und kann sich nur auf eine Tabelle beziehen.CREATE TRIGGER must be the first statement in the batch and can apply to only one table.

Ein Trigger kann nur in der aktuellen Datenbank erstellt werden; er darf jedoch auf Objekte außerhalb der aktuellen Datenbank verweisen.A trigger is created only in the current database; however, a trigger can reference objects outside the current database.

Wenn der Name des Triggerschemas angegeben ist, um den Trigger zu kennzeichnen, kennzeichnen Sie den Tabellennamen auf die gleiche Weise.If the trigger schema name is specified to qualify the trigger, qualify the table name in the same way.

Es ist möglich, in derselben CREATE TRIGGER-Anweisung dieselbe Triggeraktion für mehrere Benutzeraktionen festzulegen (beispielsweise INSERT und UPDATE).The same trigger action can be defined for more than one user action (for example, INSERT and UPDATE) in the same CREATE TRIGGER statement.

INSTEAD OF DELETE/UPDATE-Trigger können nicht für eine Tabelle definiert werden, die einen Fremdschlüssel hat, für den ON DELETE/UPDATE CASCADE angegeben ist.INSTEAD OF DELETE/UPDATE triggers cannot be defined on a table that has a foreign key with a cascade on DELETE/UPDATE action defined.

In einem Trigger kann jede beliebige SET-Anweisung angegeben werden.Any SET statement can be specified inside a trigger. Die ausgewählte SET-Option bleibt während der Ausführung des Triggers in Kraft und kehrt dann zur vorherigen Einstellung zurück.The SET option selected remains in effect during the execution of the trigger and then reverts to its former setting.

Wenn ein Trigger ausgelöst wird, werden die Ergebnisse wie bei einer gespeicherten Prozedur an die aufrufende Anwendung zurückgegeben.When a trigger fires, results are returned to the calling application, just like with stored procedures. Um zu verhindern, dass Ergebnisse aufgrund einer Triggerauslösung an eine Anwendung zurückgegeben werden, verwenden Sie in einem Trigger keine SELECT-Anweisungen, die Ergebnisse zurückgeben, oder Anweisungen, die Variablenzuweisungen durchführen.To prevent having results returned to an application because of a trigger firing, do not include either SELECT statements that return results or statements that perform variable assignment in a trigger. Ein Trigger, der SELECT-Anweisungen enthält, die Ergebnisse an den Benutzer zurückgeben, oder Anweisungen, die Variablenzuweisungen durchführen, erfordert eine besondere Bearbeitung. Diese zurückgegebenen Ergebnisse müssten sonst in allen Anwendungen geschrieben werden, in denen Änderungen an der Triggertabelle zulässig sind.A trigger that includes either SELECT statements that return results to the user or statements that perform variable assignment requires special handling; these returned results would have to be written into every application in which modifications to the trigger table are allowed. Wenn Variablenzuweisungen in einem Trigger erfolgen müssen, verwenden Sie eine SET NOCOUNT-Anweisung am Anfang des Triggers, um die Rückgabe von Resultsets zu verhindern.If variable assignment must occur in a trigger, use a SET NOCOUNT statement at the start of the trigger to prevent the return of any result sets.

Obwohl eine TRUNCATE TABLE-Anweisung mit einer DELETE-Anweisung vergleichbar ist, löst sie keine Trigger aus, da die Löschung einzelner Zeilen nicht protokolliert wird.Although a TRUNCATE TABLE statement is in effect a DELETE statement, it does not activate a trigger because the operation does not log individual row deletions. Allerdings müssen nur die Benutzer, die die Berechtigung zur Ausführung einer TRUNCATE TABLE-Anweisung besitzen, beachten, dass ein DELETE-Trigger durch eine TRUNCATE TABLE-Anweisung unbeabsichtigt umgangen werden kann.However, only those users with permissions to execute a TRUNCATE TABLE statement need be concerned about inadvertently circumventing a DELETE trigger this way.

Die WRITETEXT-Anweisung, ob protokolliert oder nicht protokolliert, aktiviert keinen Trigger.The WRITETEXT statement, whether logged or unlogged, does not activate a trigger.

Die folgenden Transact-SQLTransact-SQL-Anweisungen sind in einem DML-Trigger nicht zulässig:The following Transact-SQLTransact-SQL statements are not allowed in a DML trigger:

ALTER DATABASEALTER DATABASE CREATE DATABASECREATE DATABASE DROP DATABASEDROP DATABASE
RESTORE DATABASERESTORE DATABASE RESTORE LOGRESTORE LOG RECONFIGURERECONFIGURE

Darüber hinaus sind die folgenden Transact-SQLTransact-SQL-Anweisungen im Text des DML-Triggers nicht zulässig, wenn dieser für eine Tabelle oder Sicht verwendet wird, die das Ziel der den Trigger auslösenden Aktion ist.Additionally, the following Transact-SQLTransact-SQL statements are not allowed inside the body of a DML trigger when it is used against the table or view that is the target of the triggering action.

CREATE INDEX (einschließlich CREATE SPATIAL INDEX und CREATE XML INDEX)CREATE INDEX (including CREATE SPATIAL INDEX and CREATE XML INDEX) ALTER INDEXALTER INDEX DROP INDEXDROP INDEX
DBCC DBREINDEXDBCC DBREINDEX ALTER PARTITION FUNCTIONALTER PARTITION FUNCTION DROP TABLEDROP TABLE
ALTER TABLE bei Verwendung für die folgenden Aufgaben:ALTER TABLE when used to do the following:

Hinzufügen, Ändern oder Löschen von SpaltenAdd, modify, or drop columns.

Wechseln zwischen PartitionenSwitch partitions.

Hinzufügen oder Löschen von PRIMARY KEY- oder UNIQUE-EinschränkungenAdd or drop PRIMARY KEY or UNIQUE constraints.

Hinweis

Da SQL ServerSQL Server benutzerdefinierte Trigger für Systemtabellen nicht unterstützt, sollten Sie für Systemtabellen keine benutzerdefinierten Trigger erstellen.Because SQL ServerSQL Server does not support user-defined triggers on system tables, we recommend that you do not create user-defined triggers on system tables.

Optimieren von DML-TriggernOptimizing DML Triggers

Trigger funktionieren in Transaktionen (impliziert oder anderweitig), und während sie offen sind, sperren sie Ressourcen.Triggers work in transactions (implied, or otherwise) and while they are open, they lock resources. Die Sperre wird beibehalten, bis die Transaktion bestätigt (mit COMMIT) oder abgelehnt wurde (mit ROLLBACK).The lock will remain in place until the transaction is confirmed (with COMMIT) or rejected (with a ROLLBACK). Je länger ein Trigger ausgeführt wird, desto höher ist die Wahrscheinlichkeit, dass ein anderer Prozess blockiert wird.The longer a trigger runs, the higher the probability that another process will be blocked. Aus diesem Grund sollten Trigger so geschrieben sein, dass sie ihre Dauer bei jeder Gelegenheit verringern.Therefore, triggers should be written in a way to decrease their duration whenever possible. Eine Möglichkeit dafür ist, einen Trigger freizugeben, wenn eine DML-Anweisung 0 (null) Zeilen ändert.One way to achieve this is to release a trigger when a DML statement changes 0 rows.

Zum Freigeben des Triggers für einen Befehl, der keine Zeilen ändert, verwenden Sie die Systemvariable ROWCOUNT_BIG.To release the trigger for a command that that does not change any rows, employ the system variable ROWCOUNT_BIG.

Der folgende T-SQL-Codeausschnitt ermöglicht dies und sollte zu Beginn eines jeden DML-Triggers vorhanden sein:The following T-SQL code snippet will achieve this, and should be present at the beginning of each DML trigger:

IF (@@ROWCOUNT_BIG = 0)
RETURN;

Hinweise zu DDL-TriggernRemarks for DDL Triggers

DDL-Trigger führen, ebenso wie Standardtrigger, gespeicherte Prozeduren als Reaktion auf ein Ereignis aus.DDL triggers, like standard triggers, execute stored procedures in response to an event. Im Gegensatz zu Standardtriggern führen sie diese jedoch nicht als Reaktion auf UPDATE-, INSERT- oder DELETE-Anweisungen für eine Tabelle oder Sicht aus,But unlike standard triggers, they do not execute in response to UPDATE, INSERT, or DELETE statements on a table or view. sondern als Reaktion auf DDL-Anweisungen (Data Definition Language, Datendefinitionssprache).Instead, they primarily execute in response to data definition language (DDL) statements. Hierzu gehören CREATE-, ALTER-, DROP-, GRANT-, DENY-, REVOKE- und UPDATE STATISTICS-Anweisungen.These include CREATE, ALTER, DROP, GRANT, DENY, REVOKE, and UPDATE STATISTICS statements. Bestimmte gespeicherte Systemprozeduren, die DDL-ähnliche Vorgänge ausführen, können ebenfalls DDL-Trigger auslösen.Certain system stored procedures that perform DDL-like operations can also fire DDL triggers.

Wichtig

Testen Sie die verwendeten DDL-Trigger, um ihre Antworten auf die Ausführung von gespeicherten Systemprozeduren zu ermitteln.Test your DDL triggers to determine their responses to system stored procedure execution. So lösen beispielsweise die CREATE TYPE-Anweisung und die gespeicherten Prozeduren sp_addtype und p_rename einen DDL-Trigger aus, der für ein CREATE_TYPE-Ereignis erstellt wird.For example, the CREATE TYPE statement and the sp_addtype and sp_rename stored procedures will fire a DDL trigger that is created on a CREATE_TYPE event.

Weitere Informationen zu DDL-Triggern finden Sie unter DDL-Trigger.For more information about DDL triggers, see DDL Triggers.

DDL-Trigger werden nicht als Antwort auf Ereignisse ausgelöst, die sich auf lokale oder globale temporäre Tabellen und gespeicherte Prozeduren auswirken.DDL triggers do not fire in response to events that affect local or global temporary tables and stored procedures.

Im Gegensatz zu DML-Triggern haben DDL-Trigger keinen Schemabereich.Unlike DML triggers, DDL triggers are not scoped to schemas. Aus diesem Grund können Funktionen wie OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY und OBJECTPROPERTYEX nicht verwendet werden, um Metadaten aus DDL-Triggern abzufragen.Therefore, functions such as OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTYEX cannot be used for querying metadata about DDL triggers. Verwenden Sie stattdessen die Katalogsichten.Use the catalog views instead. Weitere Informationen finden Sie unter Abrufen von Informationen zu DDL-Triggern.For more information, see Get Information About DDL Triggers.

Hinweis

DDL-Trigger mit Serverbereich werden im Ordner Trigger vom SQL Server Management StudioSQL Server Management Studio-Objekt-Explorer angezeigt.Server-scoped DDL triggers appear in the SQL Server Management StudioSQL Server Management Studio Object Explorer in the Triggers folder. Dieser Ordner befindet sich unter dem Ordner Serverobjekte .This folder is located under the Server Objects folder. Datenbankbezogene DDL-Trigger werden im Ordner Datenbanktrigger angezeigt.Database-scoped DDL Triggers appear in the Database Triggers folder. Dieser Ordner befindet sich unter dem Ordner Programmierbarkeit der entsprechenden Datenbank.This folder is located under the Programmability folder of the corresponding database.

Logon-TriggerLogon Triggers

Logon-Trigger führen gespeicherte Prozeduren als Antwort auf ein LOGON-Ereignis aus.Logon triggers execute stored procedures in response to a LOGON event. Dieses Ereignis wird ausgelöst, wenn eine Benutzersitzung mit einer Instanz von SQL ServerSQL Servererstellt wird.This event is raised when a user session is established with an instance of SQL ServerSQL Server. Logon-Trigger werden ausgelöst, nachdem die Authentifizierungsphase der Anmeldung abgeschlossen ist und bevor die Benutzersitzung erstellt wird.Logon triggers fire after the authentication phase of logging in finishes, but before the user session is actually established. Aus diesem Grund werden alle Meldungen, die aus dem Trigger stammen und normalerweise den Benutzer erreichen (z. B. Fehlermeldungen und Meldungen aus der PRINT-Anweisung) zum SQL ServerSQL Server -Fehlerprotokoll umgeleitet.Therefore, all messages originating inside the trigger that would typically reach the user, such as error messages and messages from the PRINT statement, are diverted to the SQL ServerSQL Server error log. Weitere Informationen finden Sie unter Logon-Trigger.For more information, see Logon Triggers.

Logon-Trigger werden nicht ausgelöst, wenn die Authentifizierung nicht ausgeführt werden kann.Logon triggers do not fire if authentication fails.

Verteilte Transaktionen werden in einem Logon-Trigger nicht unterstützt.Distributed transactions are not supported in a logon trigger. Wenn ein Logon-Trigger mit einer verteilten Transaktion ausgelöst wird, wird der Fehler 3969 zurückgegeben.Error 3969 is returned when a logon trigger containing a distributed transaction is fired.

Deaktivieren eines Logon-TriggersDisabling a Logon Trigger

Ein Logon-Trigger kann effektiv erfolgreiche Verbindungen zu DatenbankmodulDatabase Engine für alle Benutzer verhindern, einschließlich Elementen der festen Serverrolle sysadmin .A logon trigger can effectively prevent successful connections to the DatenbankmodulDatabase Engine for all users, including members of the sysadmin fixed server role. Wenn ein LOGON-Trigger Verbindungen verhindert, können die Mitglieder der festen Serverrolle sysadmin über die dedizierte Administratorverbindung eine Verbindung herstellen oder durch Starten des DatenbankmodulDatabase Engine s im minimalen Konfigurationsmodus (-f).When a logon trigger is preventing connections, members of the sysadmin fixed server role can connect by using the dedicated administrator connection, or by starting the DatenbankmodulDatabase Engine in minimal configuration mode (-f). Weitere Informationen finden Sie unter Startoptionen für den Datenbank-Engine-Dienst.For more information, see Database Engine Service Startup Options.

Allgemeine Überlegungen zu TriggernGeneral Trigger Considerations

Zurückgeben von ErgebnissenReturning Results

Die Möglichkeit, Ergebnisse aus Triggern zurückzugeben, wird in einer künftigen Version von SQL Server entfernt.The ability to return results from triggers will be removed in a future version of SQL Server. Durch Trigger, die Resultsets zurückgeben, kann es in Anwendungen, die hierfür nicht konzipiert wurden, zu unerwartetem Verhalten kommen.Triggers that return result sets may cause unexpected behavior in applications that are not designed to work with them. Vermeiden Sie deshalb bei Neuentwicklungen, Resultsets aus Triggern zurückzugeben, und planen Sie die Änderung von Anwendungen, in denen dies derzeit verwendet wird.Avoid returning result sets from triggers in new development work, and plan to modify applications that currently do this. Legen Sie die Option Ergebnisse von Triggern nicht zulassen auf 1 fest, um zu verhindern, dass Trigger Resultsets zurückgeben.To prevent triggers from returning result sets, set the disallow results from triggers option to 1.

Logon-Trigger verhindern stets, dass Resultsets zurückgegeben werden. Dies ist ein nicht konfigurierbares Verhalten.Logon triggers always disallow results sets to be returned and this behavior is not configurable. Wenn von einem Logon-Trigger ein Resultset generiert wird, kann der Trigger nicht ausgeführt werden, und der Anmeldeversuch, der den Trigger ausgelöst hat, wird abgelehnt.If a logon trigger does generate a result set, the trigger fails to execute and the login attempt that fired the trigger is denied.

Mehrere TriggerMultiple Triggers

SQL ServerSQL Server ermöglicht das Erstellen mehrerer Trigger für jedes DML-, DDL- oder LOGON-Ereignis. allows for multiple triggers to be created for each DML, DDL, or LOGON event. Wenn zum Beispiel CREATE TRIGGER FOR UPDATE für eine Tabelle ausgeführt wird, die bereits über einen UPDATE-Trigger verfügt, wird ein zusätzlicher UPDATE-Trigger erstellt.For example, if CREATE TRIGGER FOR UPDATE is executed for a table that already has an UPDATE trigger, an additional update trigger is created. In früheren Versionen von SQL ServerSQL Server war pro Tabelle nur ein Trigger für jedes INSERT-, UPDATE- oder DELETE-Datenänderungsereignis zulässig.In earlier versions of SQL ServerSQL Server, only one trigger for each INSERT, UPDATE, or DELETE data modification event is allowed for each table.

Rekursive TriggerRecursive Triggers

SQL ServerSQL Server ermöglicht außerdem den rekursiven Aufruf von Triggern, wenn die RECURSIVE_TRIGGERS-Einstellung mithilfe von ALTER DATABASE aktiviert wurde. also allows for recursive invocation of triggers when the RECURSIVE_TRIGGERS setting is enabled using ALTER DATABASE.

Rekursive Trigger ermöglichen die folgenden Arten von Rekursion: Recursive triggers enable the following types of recursion to occur:

  • Indirekte RekursionIndirect recursion

    Bei der indirekten Rekursion aktualisiert eine Anwendung die T1-Tabelle.With indirect recursion, an application updates table T1. Dadurch wird der TR1-Trigger ausgelöst, der die T2-Tabelle aktualisiert.This fires trigger TR1, updating table T2. In diesem Szenario wird anschließend der TR2-Trigger ausgelöst, der die T1-Tabelle aktualisiert.In this scenario, trigger T2 then fires and updates table T1.

  • Direkte RekursionDirect recursion

    Bei der direkten Rekursion aktualisiert die Anwendung die T1-Tabelle.With direct recursion, the application updates table T1. Dadurch wird der TR1-Trigger ausgelöst, der die T1-Tabelle aktualisiert.This fires trigger TR1, updating table T1. Da die T1-Tabelle aktualisiert wurde, wird der TR1-Trigger erneut ausgelöst usw.Because table T1 was updated, trigger TR1 fires again, and so on.

    Im folgenden Beispiel werden sowohl die indirekte als auch die direkte Triggerrekursion verwendet. Angenommen, für die T1-Tabelle wurden zwei Updatetrigger, TR1 und TR2, definiert.The following example uses both indirect and direct trigger recursion Assume that two update triggers, TR1 and TR2, are defined on table T1. Der TR1-Trigger aktualisiert die T1-Tabelle rekursiv.Trigger TR1 updates table T1 recursively. Eine UPDATE-Anweisung führt TR1 und TR2 je einmal aus.An UPDATE statement executes each TR1 and TR2 one time. Darüber hinaus löst die Ausführung von TR1 die Ausführung von TR1 (rekursiv) und TR2 aus.Additionally, the execution of TR1 triggers the execution of TR1 (recursively) and TR2. Die inserted- und die deleted-Tabelle für einen bestimmten Trigger enthalten Zeilen, die nur der UPDATE-Anweisung entsprechen, die den Trigger aufgerufen hat.The inserted and deleted tables for a specific trigger contain rows that correspond only to the UPDATE statement that invoked the trigger.

Hinweis

Das obige Verhalten tritt nur dann ein, wenn die RECURSIVE_TRIGGERS-Einstellung mithilfe von ALTER DATABASE aktiviert wurde.The previous behavior occurs only if the RECURSIVE_TRIGGERS setting is enabled by using ALTER DATABASE. Es gibt keine vorgeschriebene Reihenfolge für die Ausführung mehrerer, für ein bestimmtes Ereignis definierter Trigger.There is no defined order in which multiple triggers defined for a specific event are executed. Jeder Trigger sollte unabhängig sein.Each trigger should be self-contained.

Durch Deaktivierung der RECURSIVE_TRIGGERS-Einstellung werden nur die direkten Rekursionen verhindert.Disabling the RECURSIVE_TRIGGERS setting only prevents direct recursions. Um die indirekte Rekursion zu deaktivieren, legen Sie die Serveroption Geschachtelte Trigger mithilfe von sp_configure auf 0 fest.To disable indirect recursion also, set the nested triggers server option to 0 by using sp_configure.

Führt einer der Trigger eine ROLLBACK TRANSACTION-Anweisung aus, werden unabhängig von der Schachtelungsebene keine weiteren Trigger ausgeführt.If any one of the triggers performs a ROLLBACK TRANSACTION, regardless of the nesting level, no more triggers are executed.

Geschachtelte TriggerNested Triggers

Trigger können maximal 32 Ebenen tief geschachtelt werden.Triggers can be nested to a maximum of 32 levels. Falls ein Trigger eine Tabelle ändert, für die es einen anderen Trigger gibt, wird der zweite Trigger aktiviert und kann dann seinerseits einen dritten Trigger aufrufen usw.If a trigger changes a table on which there is another trigger, the second trigger is activated and can then call a third trigger, and so on. Wenn ein Trigger in der Kette eine Endlosschleife auslöst, wird die zulässige Schachtelungsebenenzahl überschritten und der Trigger abgebrochen.If any trigger in the chain sets off an infinite loop, the nesting level is exceeded and the trigger is canceled. Wenn ein Transact-SQLTransact-SQL-Trigger verwalteten Code ausführt, indem er auf eine CLR-Routine, einen -Typ oder ein -Aggregat verweist, zählt dieser Verweis als eine Ebene der auf 32 begrenzten Schachtelungsebenen.When a Transact-SQLTransact-SQL trigger executes managed code by referencing a CLR routine, type, or aggregate, this reference counts as one level against the 32-level nesting limit. Methoden, die innerhalb des verwalteten Codes aufgerufen wurden, werden nicht auf diese Schachtelungsgrenze angerechnet.Methods invoked from within managed code do not count against this limit

Um geschachtelte Trigger zu deaktivieren, legen Sie die Option "Geschachtelte Trigger" von "sp_configure" auf 0 (deaktiviert) fest.To disable nested triggers, set the nested triggers option of sp_configure to 0 (off). In der Standardkonfiguration sind geschachtelte Trigger zulässig.The default configuration allows for nested triggers. Wenn geschachtelte Trigger deaktiviert wurden, sind rekursive Trigger ebenfalls deaktiviert, unabhängig von der durch ALTER DATABASE festgelegten RECURSIVE_TRIGGERS-Einstellung.If nested triggers are off, recursive triggers are also disabled, regardless of the RECURSIVE_TRIGGERS setting set by using ALTER DATABASE.

Der erste AFTER-Trigger, der in einem INSTEAD OF-Trigger geschachtelt ist, wird auch dann ausgelöst, wenn die Serverkonfigurationsoption geschachtelte Trigger auf 0 (null) festgelegt ist.The first AFTER trigger nested inside an INSTEAD OF trigger fires even if the nested triggers server configuration option is set to 0. Bei dieser Einstellung werden jedoch nachfolgende AFTER-Trigger nicht ausgelöst.However, under this setting, later AFTER triggers do not fire. Überprüfen Sie die Anwendungen auf geschachtelte Trigger, um zu ermitteln, ob die Anwendungen in Bezug auf dieses neue Verhalten bei Festlegung der Serverkonfigurationsoption geschachtelte Trigger auf 0 (null) noch Ihren Geschäftsregeln entsprechen. Nehmen Sie dann geeignete Änderungen vor.We recommend that you review your applications for nested triggers to determine whether the applications comply with your business rules with regard to this behavior when the nested triggers server configuration option is set to 0, and then make appropriate modifications.

Verzögerte NamensauflösungDeferred Name Resolution

SQL ServerSQL Server lässt zu, dass gespeicherte Transact-SQLTransact-SQL-Prozeduren, -Trigger und -Batches auf Tabellen verweisen, die zur Kompilierzeit noch nicht vorhanden sind. allows for Transact-SQLTransact-SQL stored procedures, triggers, and batches to refer to tables that do not exist at compile time. Diese Option wird verzögerte Namensauflösung genannt.This ability is called deferred name resolution.

BerechtigungenPermissions

Zum Erstellen eines DML-Triggers ist die ALTER-Berechtigung für die Tabelle oder Sicht erforderlich, für die der Trigger erstellt wird.To create a DML trigger requires ALTER permission on the table or view on which the trigger is being created.

Zum Erstellen eines DDL-Triggers mit einem Serverbereich (ON ALL SERVER) oder eines LOGON-Triggers ist die CONTROL SERVER-Berechtigung auf dem Server erforderlich.To create a DDL trigger with server scope (ON ALL SERVER) or a logon trigger requires CONTROL SERVER permission on the server. Zum Erstellen eines DDL-Triggers mit Datenbankbereich (ON DATABASE) ist die ALTER ANY DATABASE DDL TRIGGER-Berechtigung in der aktuellen Datenbank erforderlich.To create a DDL trigger with database scope (ON DATABASE) requires ALTER ANY DATABASE DDL TRIGGER permission in the current database.

BeispieleExamples

A.A. Verwenden eines DML-Triggers mit einer ErinnerungsmeldungUsing a DML trigger with a reminder message

Der folgende DML-Trigger gibt jedes Mal, wenn jemand versucht, Daten in die Customer-Tabelle in der AdventureWorks2012AdventureWorks2012-Datenbank einzufügen bzw. vorhandene Daten zu ändern, eine Meldung an den Client aus.The following DML trigger prints a message to the client when anyone tries to add or change data in the Customer table in the AdventureWorks2012AdventureWorks2012 database.

CREATE TRIGGER reminder1  
ON Sales.Customer  
AFTER INSERT, UPDATE   
AS RAISERROR ('Notify Customer Relations', 16, 10);  
GO  

B.B. Verwenden eines DML-Triggers mit einer E-Mail-ErinnerungsnachrichtUsing a DML trigger with a reminder e-mail message

Im folgenden Beispiel wird eine E-Mail-Nachricht an die angegebene Person (MaryM) gesendet, wenn die Customer-Tabelle geändert wird.The following example sends an e-mail message to a specified person (MaryM) when the Customer table changes.

CREATE TRIGGER reminder2  
ON Sales.Customer  
AFTER INSERT, UPDATE, DELETE   
AS  
   EXEC msdb.dbo.sp_send_dbmail  
        @profile_name = 'AdventureWorks2012 Administrator',  
        @recipients = 'danw@Adventure-Works.com',  
        @body = 'Don''t forget to print a report for the sales force.',  
        @subject = 'Reminder';  
GO  

C.C. Verwenden eines DML-AFTER-Triggers zum Erzwingen einer Geschäftsregel zwischen den Tabellen PurchaseOrderHeader und VendorUsing a DML AFTER trigger to enforce a business rule between the PurchaseOrderHeader and Vendor tables

Da sich CHECK-Einschränkungen nur auf Spalten beziehen können, für die die Einschränkung auf Spalten- oder Tabellenebene definiert wurde, müssen tabellenübergreifende Einschränkungen (in diesem Fall Geschäftsregeln) als Trigger definiert werden.Because CHECK constraints can reference only the columns on which the column-level or table-level constraint is defined, any cross-table constraints (in this case, business rules) must be defined as triggers.

Im folgenden Beispiel wird ein DML-Trigger in der AdventureWorks2012-Beispieldatenbank erstellt.The following example creates a DML trigger in the AdventureWorks2012 database. Der Trigger überprüft, ob die Bonität eines Herstellers gut ist (nicht 5), wenn versucht wird, eine neue Bestellung in die Tabelle PurchaseOrderHeader einzufügen.This trigger checks to make sure the credit rating for the vendor is good (not 5) when an attempt is made to insert a new purchase order into the PurchaseOrderHeader table. Um die Bonität des Herstellers zu ermitteln, muss auf die Vendor-Tabelle verwiesen werden.To obtain the credit rating of the vendor, the Vendor table must be referenced. Ist die Bonität zu niedrig, wird eine Meldung angezeigt, und die Bestellung wird nicht eingefügt.If the credit rating is too low, a message is displayed and the insertion does not execute.

-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader 
-- table when the credit rating of the specified vendor is set to 5 (below average).  

CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader  
AFTER INSERT  
AS  
IF (@@ROWCOUNT_BIG  = 0)
RETURN;
IF EXISTS (SELECT *  
           FROM Purchasing.PurchaseOrderHeader AS p   
           JOIN inserted AS i   
           ON p.PurchaseOrderID = i.PurchaseOrderID   
           JOIN Purchasing.Vendor AS v   
           ON v.BusinessEntityID = p.VendorID  
           WHERE v.CreditRating = 5  
          )  
BEGIN  
RAISERROR ('A vendor''s credit rating is too low to accept new  
purchase orders.', 16, 1);  
ROLLBACK TRANSACTION;  
RETURN   
END;  
GO  

-- This statement attempts to insert a row into the PurchaseOrderHeader table  
-- for a vendor that has a below average credit rating.  
-- The AFTER INSERT trigger is fired and the INSERT transaction is rolled back.  

INSERT INTO Purchasing.PurchaseOrderHeader (RevisionNumber, Status, EmployeeID,  
VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight)  
VALUES (  
2  
,3  
,261  
,1652  
,4  
,GETDATE()  
,GETDATE()  
,44594.55  
,3567.564  
,1114.8638 );  
GO  

D.D. Verwenden eines DDL-Triggers mit DatenbankbereichUsing a database-scoped DDL trigger

Im folgenden Beispiel wird ein DDL-Trigger verwendet, um zu verhindern, dass ein Synonym aus einer Datenbank gelöscht wird.The following example uses a DDL trigger to prevent any synonym in a database from being dropped.

CREATE TRIGGER safety   
ON DATABASE   
FOR DROP_SYNONYM  
AS   
IF (@@ROWCOUNT = 0)
RETURN;
   RAISERROR ('You must disable Trigger "safety" to drop synonyms!',10, 1)  
   ROLLBACK  
GO  
DROP TRIGGER safety  
ON DATABASE;  
GO  

E.E. Verwenden eines DDL-Triggers mit ServerbereichUsing a server-scoped DDL trigger

Im folgenden Beispiel wird ein DDL-Trigger verwendet, um eine Meldung auszugeben, wenn ein CREATE DATABASE-Ereignis auf der aktuellen Serverinstanz eintritt. Mithilfe der EVENTDATA-Funktion wird der Text der entsprechenden Transact-SQLTransact-SQL-Anweisung abgerufen.The following example uses a DDL trigger to print a message if any CREATE DATABASE event occurs on the current server instance, and uses the EVENTDATA function to retrieve the text of the corresponding Transact-SQLTransact-SQL statement. Weitere Beispiele für die Verwendung von EVENTDATA in DDL-Triggern finden Sie unter Verwenden der EVENTDATA-Funktion.For more examples that use EVENTDATA in DDL triggers, see Use the EVENTDATA Function.

Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

CREATE TRIGGER ddl_trig_database   
ON ALL SERVER   
FOR CREATE_DATABASE   
AS   
    PRINT 'Database Created.'  
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')  
GO  
DROP TRIGGER ddl_trig_database  
ON ALL SERVER;  
GO  

F.F. Verwenden eines LOGON-TriggersUsing a logon trigger

Im folgenden Beispiel für LOGON-Trigger wird ein Anmeldeversuch bei SQL ServerSQL Server als Mitglied des Anmeldenamens login_test abgewiesen, wenn unter diesem Anmeldenamen bereits drei Benutzersitzungen ausgeführt werden.The following logon trigger example denies an attempt to log in to SQL ServerSQL Server as a member of the login_test login if there are already three user sessions running under that login.

Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

USE master;  
GO  
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE,  
    CHECK_EXPIRATION = ON;  
GO  
GRANT VIEW SERVER STATE TO login_test;  
GO  
CREATE TRIGGER connection_limit_trigger  
ON ALL SERVER WITH EXECUTE AS 'login_test'  
FOR LOGON  
AS  
BEGIN  
IF ORIGINAL_LOGIN()= 'login_test' AND  
    (SELECT COUNT(*) FROM sys.dm_exec_sessions  
            WHERE is_user_process = 1 AND  
                original_login_name = 'login_test') > 3  
    ROLLBACK;  
END;  

G.G. Anzeigen der Ereignisse, die einen Trigger auslösenViewing the events that cause a trigger to fire

Im folgenden Beispiel werden die sys.triggers- und die sys.trigger_events-Katalogsichten abgefragt, um zu ermitteln, welche Transact-SQLTransact-SQL-Sprachereignisse bewirken, dass der safety-Trigger ausgelöst wird.The following example queries the sys.triggers and sys.trigger_events catalog views to determine which Transact-SQLTransact-SQL language events cause trigger safety to fire. safety wurde im vorherigen Beispiel erstellt.safety is created in the previous example.

SELECT TE.*  
FROM sys.trigger_events AS TE  
JOIN sys.triggers AS T ON T.object_id = TE.object_id  
WHERE T.parent_class = 0 AND T.name = 'safety';  
GO  

Weitere Informationen finden Sie unterSee Also

ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
ALTER TRIGGER (Transact-SQL) ALTER TRIGGER (Transact-SQL)
COLUMNS_UPDATED (Transact-SQL) COLUMNS_UPDATED (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
DROP TRIGGER (Transact-SQL) DROP TRIGGER (Transact-SQL)
ENABLE TRIGGER (Transact-SQL) ENABLE TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL) DISABLE TRIGGER (Transact-SQL)
TRIGGER_NESTLEVEL (Transact-SQL) TRIGGER_NESTLEVEL (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
sys.dm_sql_referenced_entities (Transact-SQL) sys.dm_sql_referenced_entities (Transact-SQL)
sys.dm_sql_referencing_entities (Transact-SQL) sys.dm_sql_referencing_entities (Transact-SQL)
sys.sql_expression_dependencies (Transact-SQL) sys.sql_expression_dependencies (Transact-SQL)
sp_help (Transact-SQL) sp_help (Transact-SQL)
sp_helptrigger (Transact-SQL) sp_helptrigger (Transact-SQL)
sp_helptext (Transact-SQL) sp_helptext (Transact-SQL)
sp_rename (Transact-SQL) sp_rename (Transact-SQL)
sp_settriggerorder (Transact-SQL) sp_settriggerorder (Transact-SQL)
UPDATE() (Transact-SQL) UPDATE() (Transact-SQL)
Abrufen von Informationen zu DML-Triggern Get Information About DML Triggers
Abrufen von Informationen zu DDL-Triggern Get Information About DDL Triggers
sys.triggers (Transact-SQL) sys.triggers (Transact-SQL)
sys.trigger_events (Transact-SQL) sys.trigger_events (Transact-SQL)
sys.sql_modules (Transact-SQL) sys.sql_modules (Transact-SQL)
sys.assembly_modules (Transact-SQL) sys.assembly_modules (Transact-SQL)
sys.server_triggers (Transact-SQL) sys.server_triggers (Transact-SQL)
sys.server_trigger_events (Transact-SQL) sys.server_trigger_events (Transact-SQL)
sys.server_sql_modules (Transact-SQL) sys.server_sql_modules (Transact-SQL)
sys.server_assembly_modules (Transact-SQL)sys.server_assembly_modules (Transact-SQL)