Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Database SQL di Azure
Istanza 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
, GRANT
DROP
DENY
ALTER
REVOKE
o .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
, OBJECTPROPERTY
e 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 TABLE
istruzione , ALTER TABLE
o 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à correlate
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 |