Trigger DDLDDL Triggers

I trigger DDL vengono eseguiti in risposta a vari eventi DDL (Data Definition Language),DDL triggers fire in response to a variety of Data Definition Language (DDL) events. Questi eventi corrispondono principalmente a istruzioni Transact-SQLTransact-SQL che iniziano con le parole chiave CREATE, ALTER, DROP, GRANT, DENY, REVOKE o UPDATE STATISTICS.These events primarily correspond to Transact-SQLTransact-SQL statements that start with the keywords CREATE, ALTER, DROP, GRANT, DENY, REVOKE or UPDATE STATISTICS. Alcune stored procedure di sistema che eseguono operazioni di tipo DDL possono inoltre attivare trigger DDL.Certain system stored procedures that perform DDL-like operations can also fire DDL triggers.

Utilizzare trigger DDL nei casi seguenti:Use DDL triggers when you want to do the following:

  • Impedire modifiche specifiche nello schema di database.Prevent certain changes to your database schema.

  • Fare in modo che nel database si verifichi un cambiamento in risposta a una modifica nello schema di database.Have something occur in the database in response to a change in your database schema.

  • Registrare modifiche o eventi nello schema di database.Record changes or events in the database schema.

Importante

Testare i trigger DDL per determinarne la risposta alle stored procedure di sistema eseguite.Test your DDL triggers to determine their responses to system stored procedures that are run. Sia l'istruzione CREATE TYPE che la stored procedure sp_addtype , ad esempio, attivano un trigger DDL creato in un evento CREATE_TYPE.For example, the CREATE TYPE statement and the sp_addtype stored procedure will both fire a DDL trigger that is created on a CREATE_TYPE event.

Tipi di trigger DDLTypes of DDL Triggers

Trigger DDL di Transact-SQLTransact-SQL DDL Trigger
Un tipo speciale di stored procedure Transact-SQLTransact-SQL che esegue una o più istruzioni Transact-SQLTransact-SQL in risposta a un evento con ambito server o con ambito database.A special type of Transact-SQLTransact-SQL stored procedure that executes one more more Transact-SQLTransact-SQL statements in response to a server-scoped or database-scoped event. Ad esempio, è possibile che un trigger DDL si attivi se viene eseguita un'istruzione come ALTER SERVER CONFIGURATION o se una tabella viene eliminata tramite DROP TABLE.For example, a DDL Trigger may fire if a statement such as ALTER SERVER CONFIGURATION is executed or if a table is deleted by using DROP TABLE.

Trigger CLR DDLCLR DDL Trigger
Anziché eseguire una stored procedure Transact-SQLTransact-SQL , un trigger CLR consente di eseguire uno o più metodi scritti in codice gestito che sono membri di un assembly creato in .NET Framework e caricato in SQL ServerSQL Server.Instead of executing a Transact-SQLTransact-SQL stored procedure, a CLR trigger executes one or more methods written in managed code that are members of an assembly created in the .NET Framework and uploaded in SQL ServerSQL Server.

I trigger DDL vengono attivati solo in seguito all'esecuzione delle istruzioni DDL che li hanno generatiDDL triggers fire only after the DDL statements that trigger them are run. I trigger DDL non possono essere utilizzati come trigger INSTEAD OF.DDL triggers cannot be used as INSTEAD OF triggers. I trigger DDL non vengono attivati in risposta a eventi che interessano stored procedure e tabelle temporanee globali o locali.DDL triggers do not fire in response to events that affect local or global temporary tables and stored procedures.

I trigger DDL non creano le tabelle inserted e deleted .DDL triggers do not create the special inserted and deleted tables.

Le informazioni relative a un evento che attiva un trigger DDL e le successive modifiche provocate dal trigger vengono acquisite mediante la funzione EVENTDATA.The information about an event that fires a DDL trigger, and the subsequent changes caused by the trigger, is captured by using the EVENTDATA function.

Più trigger da creare per ogni evento DDL.Multiple triggers to be created for each DDL event.

Diversamente dai trigger DML, i trigger DDL non sono definiti a livello di ambito di schema.Unlike DML triggers, DDL triggers are not scoped to schemas. Pertanto, non è possibile utilizzare funzioni quali OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY e OBJECTPROPERTYEX durante l'esecuzione di query sui metadati relativi ai trigger DDL.Therefore, functions such as OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTYEX cannot be used for querying metadata about DDL triggers. Utilizzare in alternativa le viste del catalogo.Use the catalog views instead.

I trigger DDL con ambito server sono disponibili in Esplora oggetti di SQL Server Management Studio nella cartella TriggerServer-scoped DDL triggers appear in the SQL Server Management Studio Object Explorer in the Triggers folder. all'interno della cartella Oggetti server .This folder is located under the Server Objects folder. I trigger DDL con ambito database sono disponibili nella cartella Trigger databaseDatabase-scoped DDL triggers appear in the Database Triggers folder. all'interno della cartella Programmabilità del database corrispondente.This folder is located under the Programmability folder of the corresponding database.

Importante

L'innalzamento di livello dei privilegi consente l'esecuzione di malware all'interno dei trigger.Malicious code inside triggers can run under escalated privileges. Per altre informazioni su come limitare tale minaccia, vedere Gestione della sicurezza dei trigger.For more information about how to help reduce this threat, see Manage Trigger Security.

Ambito del trigger DDLDDL Trigger Scope

I trigger DDL vengono attivati in risposta a un evento Transact-SQLTransact-SQL elaborato nel database o nel server corrente.DDL triggers can fire in response to a Transact-SQLTransact-SQL event processed in the current database, or on the current server. L'ambito del trigger dipende dall'evento.The scope of the trigger depends on the event. Ad esempio, un trigger DDL creato in modo da essere attivato in risposta a un evento CREATE_TABLE può essere attivato ogni volta che nel database o nell'istanza del server si verifica un evento CREATE_TABLE.For example, a DDL trigger created to fire in response to a CREATE_TABLE event can do so whenever a CREATE_TABLE event occurs in the database, or on the server instance. Un trigger DDL creato in modo da essere attivato in risposta a un evento CREATE_LOGIN può essere attivato solo quando si verifica un evento CREATE_LOGIN nell'istanza del server.A DDL trigger created to fire in response to a CREATE_LOGIN event can do so only when a CREATE_LOGIN event occurs in the server instance.

Nell'esempio seguente il trigger DDL safety viene attivato ogni volta che nel database si verifica un evento DROP_TABLE o ALTER_TABLE :In the following example, DDL trigger safety will fire whenever a DROP_TABLE or ALTER_TABLE event occurs in the database.

CREATE TRIGGER safety   
ON DATABASE   
FOR DROP_TABLE, ALTER_TABLE   
AS   
   PRINT 'You must disable Trigger "safety" to drop or alter tables!'   
   ROLLBACK;  

Nell'esempio seguente un trigger DDL consente di visualizzare un messaggio se nell'istanza corrente del server si verifica un evento CREATE_DATABASE .In the following example, a DDL trigger prints a message if any CREATE_DATABASE event occurs on the current server instance. Nell'esempio viene utilizzata la funzione EVENTDATA per recuperare il testo dell'istruzione Transact-SQLTransact-SQL corrispondente.The example uses the EVENTDATA function to retrieve the text of the corresponding Transact-SQLTransact-SQL statement. Per altre informazioni sull'uso di EVENTDATA con i trigger DDL, vedere Utilizzo della funzione EVENTDATA.For more information about how to use EVENTDATA with DDL triggers, see Use the EVENTDATA Function.

IF EXISTS (SELECT * FROM sys.server_triggers  
    WHERE name = 'ddl_trig_database')  
DROP TRIGGER ddl_trig_database  
ON ALL SERVER;  
GO  
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  

Per accedere agli elenchi in cui viene eseguito il mapping tra le istruzioni Transact-SQLTransact-SQL e gli ambiti che possono essere specificati per tali istruzioni, utilizzare i collegamenti disponibili nella sezione "Selezione di un'istruzione DDL specifica per l'attivazione di un trigger DDL" di seguito in questo argomento.The lists that map the Transact-SQLTransact-SQL statements to the scopes that can be specified for them are available through the links provided in the section "Selecting a Particular DDL Statement to Fire a DDL Trigger," later in this topic.

I trigger DDL definiti a livello di ambito di database sono archiviati come oggetti nel database in cui vengono creati.Database-scoped DDL triggers are stored as objects in the database in which they are created. È possibile creare nel database master trigger DDL con un funzionamento analogo a quello dei trigger creati nei database progettati dall'utente.DDL triggers can be created in the master database and behave just like those created in user-designed databases. È possibile ottenere informazioni sui trigger DDL eseguendo una query sulla vista del catalogo sys.triggers .You can obtain information about DDL triggers by querying the sys.triggers catalog view. È possibile eseguire una query su sys.triggers nel contesto di database in cui vengono creati i trigger oppure specificando il nome del database come identificatore, ad esempio master.sys.triggers.You can query sys.triggers within the database context in which the triggers are created or by specifying the database name as an identifier, such as master.sys.triggers.

I trigger DDL definiti a livello di ambito di server sono archiviati come oggetti nel database master .Server-scoped DDL triggers are stored as objects in the master database. È tuttavia possibile ottenere informazioni sui trigger DDL con ambito server eseguendo una query sulla vista del catalogo sys.server_triggers in qualsiasi contesto di database.However, you can obtain information about server-scoped DDL triggers by querying the sys.server_triggers catalog view in any database context.

Specifica di un'istruzione o di un gruppo di istruzioni Transact-SQLSpecifying a Transact-SQL Statement or Group of Statements

Selezione di un'istruzione DDL specifica per l'attivazione di un trigger DDLSelecting a Particular DDL Statement to Fire a DDL Trigger

È possibile progettare i trigger DDL in modo che vengano attivati dopo l'esecuzione di una o più istruzioni Transact-SQLTransact-SQL specifiche.DDL triggers can be designed to fire after one or more particular Transact-SQLTransact-SQL statements are run. Nell'esempio precedente, il trigger safety viene attivato dopo un evento DROP_TABLE o ALTER_TABLE .In the previous example, trigger safety fires after any DROP_TABLE or ALTER_TABLE event. Per un elenco delle istruzioni Transact-SQLTransact-SQL che è possibile specificare per attivare un trigger e informazioni sull'ambito in cui ciascun trigger può essere attivato, vedere Eventi DDL.For lists of the Transact-SQLTransact-SQL statements that can be specified to fire a DDL trigger, and the scope at which the trigger can fire, see DDL Events.

Selezione di un gruppo predefinito di istruzioni DDL per l'attivazione di un trigger DDLSelecting a Predefined Group of DDL Statements to Fire a DDL Trigger

Un trigger DDL può essere attivato dopo l'esecuzione di qualsiasi evento Transact-SQLTransact-SQL appartenente a un raggruppamento predefinito di eventi simili.A DDL trigger can fire after execution of any Transact-SQLTransact-SQL event that belongs to a predefined grouping of similar events. Se, ad esempio, si desidera che un trigger DDL venga attivato dopo l'esecuzione di qualsiasi istruzione CREATE TABLE, ALTER TABLE o DROP TABLE, è possibile specificare FOR DDL_TABLE_EVENTS nell'istruzione CREATE TRIGGER.For example, if you want a DDL trigger to fire after any CREATE TABLE, ALTER TABLE, or DROP TABLE statement is run, you can specify FOR DDL_TABLE_EVENTS in the CREATE TRIGGER statement. Dopo l'esecuzione di CREATE TRIGGER, gli eventi inclusi in un gruppo di eventi verranno aggiunti alla vista del catalogo sys.trigger_events .After CREATE TRIGGER is run, the events that are covered by an event group are added to the sys.trigger_events catalog view.

In SQL Server 2005SQL Server 2005se un trigger viene creato in un gruppo di eventi, sys.trigger_events non include informazioni sul gruppo di eventi. In sys.trigger_events sono incluse solo informazioni sui singoli eventi inclusi nel gruppo in questione.In SQL Server 2005SQL Server 2005, if a trigger is created on an event group, sys.trigger_events does not include information about the event group, sys.trigger_events includes information only about the individual events covered by that group. In SQL Server 2008SQL Server 2008 e versioni successive, sys.trigger_events rende persistenti i metadati relativi al gruppo di eventi nel quale sono creati i trigger, nonché quelli relativi ai singoli eventi inclusi nel gruppo di eventi.In SQL Server 2008SQL Server 2008 and higher, sys.trigger_events persists metadata about the event group on which the triggers is created, and also about the individual events that the event group covers. Le modifiche agli eventi inclusi nei gruppi di eventi in SQL Server 2008SQL Server 2008 e versioni successive non vengono pertanto applicate ai trigger DDL creati in tali gruppi di eventi in SQL Server 2005SQL Server 2005.Therefore, changes to the events that are covered by event groups in SQL Server 2008SQL Server 2008 and higher do not apply to DDL triggers that are created on those event groups in SQL Server 2005SQL Server 2005.

Per un elenco dei gruppi predefiniti di istruzioni DDL disponibili per i trigger DDL e per informazioni sulle istruzioni specifiche incluse nei gruppi di eventi e sugli ambiti in cui è possibile programmare tali gruppi, vedere Gruppi di eventi DDL.For a list of the predefined groups of DDL statements that are available for DDL triggers, the particular statements the event groups cover, and the scopes at which these event groups can be programmed, see DDL Event Groups.

AttivitàTask ArgomentoTopic
Vengono descritte le procedure di creazione, modifica e disabilitazione dei trigger DDL.Describes how to create, modify, delete or disable DDL triggers. Implementazione di trigger DDLImplement DDL Triggers
Viene illustrato come creare un trigger CLR DDL.Describes how to create a CLR DDL trigger. Creazione di trigger CLRCreate CLR Triggers
Viene descritto come restituire informazioni sui trigger DDL.Describes how to return information about DDL triggers. Ottieni informazioni sui trigger DDLGet Information About DDL Triggers
Viene descritto come restituire informazioni relative a un evento che attiva un trigger DDL utilizzando la funzione EVENTDATA.Describes how to return information about an event that fires a DDL trigger by using the EVENTDATA function. Utilizzo della funzione EVENTDATAUse the EVENTDATA Function
Viene descritto come gestire la sicurezza dei trigger.Describes how to manage trigger security. Gestione della sicurezza dei triggerManage Trigger Security

Vedere ancheSee Also

Trigger DML DML Triggers
Trigger LOGON Logon Triggers
CREATE TRIGGER (Transact-SQL)CREATE TRIGGER (Transact-SQL)