Progettazione di trigger DDL

Data aggiornamento: 12 dicembre 2006

Per poter progettare un trigger DDL, è necessario:

  • Aver compreso l'ambito del trigger DDL.
  • Aver determinato l'istruzione o il gruppo di istruzioni Transact-SQL che attiva il trigger.
ms186406.security(it-it,SQL.90).gifNota sulla protezione:
Malware all'interno dei trigger può essere eseguito con privilegi con escalation. Per ulteriori informazioni su come ridurre questa minaccia, vedere Gestione della protezione dei trigger.

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 verrà attivato ogni volta che nel database si verifica un evento CREATE TABLE. Un trigger DDL creato in modo da essere attivato in risposta a un evento CREATE LOGIN verrà invece attivato ogni volta che nel server si verifica un evento CREATE LOGIN.

Nell'esempio seguente viene attivato il trigger DDL safety 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 tramite un trigger DDL viene visualizzato un messaggio se nell'istanza corrente del server si verifica qualsiasi evento CREATE DATABASE. Per recuperare il testo dell'istruzione Transact-SQL corrispondente, viene utilizzata la funzione EVENTDATA. 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 il cui funzionamento sarà analogo a quello dei trigger creati nei database progettati dall'utente. È possibile ottenere informazioni sui trigger DLL nella vista del catalogo sys.triggers nel contesto di database in cui vengono creati 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. Le informazioni su tale tipo di trigger sono tuttavia reperibili nella 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.

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

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

È possibile creare trigger DLL in modo che si attivino in risposta agli eventi seguenti:

  • Una o più istruzioni DDL specifiche
  • 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 qualsiasi evento DROP TABLE o ALTER TABLE.

Non tutti gli eventi DDL possono essere utilizzati per l'attivazione dei trigger DDL. Alcuni eventi devono essere utilizzati esclusivamente per istruzioni asincrone non incluse in transazioni. Ad esempio, non è possibile utilizzare un evento ADD_ROLE_MEMBER per attivare un trigger DDL. ma per questi eventi è necessario utilizzare le notifiche degli eventi. Per ulteriori informazioni sulle notifiche degli eventi, vedere Notifiche degli eventi (Motore di database).

Nell'argomento Eventi DDL utilizzabili con i trigger DDL vengono elencate le istruzioni Transact-SQL che è possibile specificare per attivare un trigger DDL e viene indicato l'ambito di attivazione.

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.

Nell'argomento Gruppi di eventi per l'utilizzo con i trigger DDL sono elencati i gruppi predefiniti di istruzioni DDL disponibili per i trigger DDL, nonché le specifiche istruzioni interessate e gli ambiti in cui è possibile programmare tali gruppi.

Vedere anche

Concetti

Utilizzo della funzione EVENTDATA
Informazioni sui trigger DDL
Implementazione di trigger DDL

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia

12 dicembre 2006

Contenuto modificato:
  • Correzioni delle informazioni in cui si affermava che un evento CREATE_DATABASE non può essere utilizzato per attivare un trigger DDL. Tale evento è stato sostituito dall'evento ADD_ROLE_MEMBER come esempio di evento che può essere utilizzato per attivare una notifica degli eventi ma non un trigger DDL.

17 luglio 2006

Contenuto modificato:
  • Aggiornamento del secondo esempio in "Informazioni sull'ambito del trigger".