Condividi tramite


Trigger DDL

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di Azure

I trigger DDL vengono attivati in risposta a vari eventi di linguaggio di definizione dei dati (DDL). Questi eventi corrispondono principalmente alle istruzioni Transact-SQL che iniziano con le parole chiave CREATE, GRANTDROPDENYALTERREVOKEo .UPDATE STATISTICS Alcune stored procedure di sistema che eseguono operazioni di tipo DDL possono inoltre attivare trigger DDL.

Usare i trigger DDL quando si vogliono eseguire le attività seguenti:

  • Impedire modifiche specifiche nello schema di database.
  • Fare in modo che nel database si verifichi un cambiamento in risposta a una modifica nello schema di database.
  • Registrare modifiche o eventi nello schema di database.

Importante

Testare i trigger DDL per determinarne la risposta alle stored procedure di sistema eseguite. Ad esempio, l'istruzione CREATE TYPE e la sp_addtype stored procedure attivano entrambi un trigger DDL creato in un CREATE_TYPE evento.

Tipi di trigger DDL

Transact-SQL trigger

Un tipo speciale di stored procedure Transact-SQL che esegue una o più istruzioni Transact-SQL in risposta a un evento con ambito server o con ambito database. Ad esempio, un trigger DDL potrebbe essere attivato se un'istruzione, ad ALTER SERVER CONFIGURATION esempio, viene eseguita o se una tabella viene eliminata tramite DROP TABLE.

Attivatore CLR

Anziché eseguire una stored procedure Transact-SQL, un trigger CLR (Common Language Runtime) esegue uno o più metodi scritti in codice gestito che sono membri di un assembly creato in .NET Framework e caricati in SQL Server.

I trigger DDL vengono attivati solo in seguito all'esecuzione delle istruzioni DDL che li hanno generati I trigger DDL non possono essere utilizzati come trigger INSTEAD OF. I trigger DDL non vengono attivati in risposta a eventi che interessano stored procedure e tabelle temporanee globali o locali.

Trigger DDL non creano le tabelle inserted e deleted speciali.

Le informazioni su un evento che genera un trigger DDL e le successive modifiche causate dal trigger vengono acquisite tramite la EVENTDATA funzione .

Più trigger da creare per ogni evento DDL.

A differenza dei trigger DML (Data Manipulation Language), i trigger DDL non rientrano nell'ambito degli schemi. Di conseguenza, le funzioni come OBJECT_ID, OBJECT_NAME, OBJECTPROPERTYe OBJECTPROPERTYEX non possono essere usate per eseguire query sui metadati sui trigger DDL. Utilizzare in alternativa le viste del catalogo.

I trigger DDL con ambito server sono disponibili in Esplora oggetti di SQL Server Management Studio nella cartella Trigger all'interno della cartella Oggetti server . I trigger DDL con ambito database sono disponibili nella cartella Trigger database all'interno della cartella Programmabilità del database corrispondente.

Importante

L'innalzamento di livello dei privilegi consente l'esecuzione di malware all'interno dei trigger. Per altre informazioni su come ridurre questa minaccia, vedere Gestire la sicurezza dei trigger.

Ambito del trigger DDL

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 per l'attivazione in risposta a un CREATE_TABLE evento può farlo ogni volta che si verifica un CREATE_TABLE evento nel database o nell'istanza del server. Un trigger DDL creato per attivarsi in risposta a un CREATE_LOGIN event può farlo solo quando si verifica un CREATE_LOGIN event nell'istanza del server.

Nell'esempio seguente il trigger safety DDL viene attivato ogni volta che si verifica un DROP_TABLE evento o ALTER_TABLE nel 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 . Nell'esempio viene utilizzata la funzione EVENTDATA per recuperare il testo dell'istruzione Transact-SQL corrispondente. Per altre informazioni su come usare EVENTDATA i trigger DDL, vedere Usare la 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;

Gli elenchi che eseguono il mapping delle istruzioni Transact-SQL agli ambiti che possono essere specificati per tali istruzioni sono disponibili tramite i collegamenti forniti nella sezione Selezionare una specifica istruzione DDL per attivare un trigger DDL più avanti in questo articolo.

I trigger DDL con ambito database vengono archiviati come oggetti nel database in cui vengono creati. I trigger DDL possono essere creati nel master database e si comportano esattamente come quelli creati nei database progettati dall'utente. È possibile ottenere informazioni sui trigger DDL eseguendo una query sulla vista catalogo sys.triggers. È possibile eseguire una query sys.triggers all'interno del contesto del database in cui vengono creati i trigger o specificando il nome del database come identificatore, ad esempio master.sys.triggers.

I trigger DDL a livello di server vengono archiviati come oggetti nel database master. Tuttavia, è possibile ottenere informazioni sui trigger DDL con ambito server interrogando la vista catalogo sys.server_triggers in qualsiasi contesto di database.

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

Seleziona una specifica istruzione DDL per attivare 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.

Seleziona un gruppo predefinito di istruzioni DDL per attivare 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. Ad esempio, se si vuole che un trigger DDL venga attivato dopo l'esecuzione di qualsiasi CREATE TABLEistruzione , ALTER TABLEo DROP TABLE , è possibile specificare FOR DDL_TABLE_EVENTS nell'istruzione CREATE TRIGGER . Dopo che CREATE TRIGGER viene eseguito, gli eventi coperti da un gruppo di eventi vengono aggiunti al catalogo della vista sys.trigger_events.

In SQL Server 2005 (9.x), se un trigger viene creato in un gruppo di eventi, sys.trigger_events non include informazioni sul gruppo di eventi, sys.trigger_events include informazioni solo sui singoli eventi coperti da tale gruppo. sys.trigger_events rende persistenti i metadati relativi al gruppo di eventi in cui viene creato il trigger e anche ai singoli eventi coperti dal gruppo di eventi. Di conseguenza, le modifiche agli eventi coperti dai gruppi di eventi non si applicano ai trigger DDL nelle versioni recenti di SQL Server create in tali gruppi di eventi in SQL Server 2005 (9.x).

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.

Attività Articolo
Viene descritto come creare, modificare, eliminare o disabilitare i trigger DDL. Implementare trigger DDL
Viene illustrato come creare un trigger CLR DDL. Creare trigger CLR
Viene descritto come restituire informazioni sui trigger DDL. Ottenere informazioni sui trigger DDL
Viene descritto come restituire informazioni su un evento che genera un trigger DDL tramite la EVENTDATA funzione . Usare la funzione EVENTDATA
Viene descritto come gestire la sicurezza dei trigger. Gestire la sicurezza dei trigger