Progettazione di trigger DDL

Per poter progettare un trigger DDL, è necessario:

  • Conoscere l'ambito del trigger DDL.

  • Determinare l'istruzione o il gruppo di istruzioni Transact-SQL che attiva il trigger.

Nota sulla protezioneNota sulla protezione

Malware all'interno dei trigger può essere eseguito con privilegi con escalation. Per ulteriori informazioni su come limitare tale minaccia, vedere Gestione della protezione dei trigger.

[!NOTA]

I trigger DDL non vengono attivati in risposta a eventi che interessano stored procedure e tabelle temporanee globali o locali.

Informazioni sull'ambito del trigger

I trigger DDL vengono attivati in risposta a un evento Transact-SQL elaborato nel database o nel server corrente. L'ambito del trigger dipende dall'evento. 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. 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 nel server.

Nell'esempio seguente il trigger DDL safety viene attivato ogni volta che nel database si verifica un evento DROP_TABLE o ALTER_TABLE:

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. Nell'esempio viene utilizzata la funzione EVENTDATA per recuperare il testo dell'istruzione Transact-SQL corrispondente. Per ulteriori informazioni sull'utilizzo di EVENTDATA con i trigger DDL, vedere Utilizzo della funzione EVENTDATA.

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-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.

I trigger DDL definiti a livello di ambito di database sono archiviati come oggetti nel database in cui vengono creati. È possibile creare nel database master trigger DDL con un funzionamento analogo a quello dei trigger creati nei database progettati dall'utente. È possibile ottenere informazioni sui trigger DDL eseguendo una query sulla vista del catalogo sys.triggers. È 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.

I trigger DDL definiti a livello di ambito di server sono archiviati come oggetti nel database master. È 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.

Per ulteriori informazioni su come recuperare i metadati per i trigger DDL, vedere Informazioni sui trigger DDL.

Specifica di un'istruzione o di un gruppo di istruzioni Transact-SQL

È possibile creare i trigger DDL in modo che vengano attivati in risposta a una o più istruzioni DDL specifiche o a un gruppo predefinito di istruzioni DDL.

Selezione di un'istruzione DDL specifica per l'attivazione di un trigger DDL

È possibile progettare i trigger DDL in modo che vengano attivati dopo l'esecuzione di una o più istruzioni Transact-SQL specifiche. Nell'esempio precedente, il trigger safety viene attivato dopo un evento DROP_TABLE o ALTER_TABLE. Per un elenco delle istruzioni Transact-SQL che è possibile specificare per attivare un trigger e informazioni sull'ambito in cui ciascun trigger può essere attivato, vedere Eventi DDL.

Selezione di un gruppo predefinito di istruzioni DDL per l'attivazione di un trigger DDL

Un trigger DDL può essere attivato dopo l'esecuzione di qualsiasi evento Transact-SQL appartenente a un raggruppamento predefinito di eventi simili. 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. Dopo l'esecuzione di CREATE TRIGGER, gli eventi inclusi in un gruppo di eventi verranno aggiunti alla vista del catalogo sys.trigger_events.

[!NOTA]

In SQL Server 2005 se 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 2008sys.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. Le modifiche agli eventi inclusi nei gruppi di eventi in SQL Server 2008 non vengono applicate ai trigger DDL creati in tali gruppi di eventi in SQL 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.