Delen via


DDL-triggers

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

DDL activeert een brand als reactie op verschillende DDL-gebeurtenissen (Data Definition Language). Deze gebeurtenissen komen voornamelijk overeen met Transact-SQL instructies die beginnen met de trefwoorden CREATE, ALTER, DROP, GRANT, DENY, REVOKE, of UPDATE STATISTICS. Bepaalde door het systeem opgeslagen procedures die DDL-achtige bewerkingen uitvoeren, kunnen ook DDL-triggers activeren.

Gebruik DDL-triggers wanneer u de volgende taken wilt uitvoeren:

  • Voorkomen dat bepaalde wijzigingen in uw databaseschema worden aangebracht.
  • Zorg ervoor dat er iets gebeurt in de database als reactie op een wijziging in uw databaseschema.
  • Noteer wijzigingen of gebeurtenissen in het databaseschema.

Belangrijk

Test uw DDL-triggers om hun reacties te bepalen op door het systeem opgeslagen procedures die worden uitgevoerd. De CREATE TYPE instructie en de opgeslagen procedure sp_addtype activeren bijvoorbeeld beide een DDL-trigger die door een CREATE_TYPE gebeurtenis wordt gemaakt.

Typen DDL-trigger

Transact-SQL trigger

Een speciaal type Transact-SQL opgeslagen procedure waarmee een of meer Transact-SQL instructies worden uitgevoerd als reactie op een gebeurtenis met serverbereik of databasebereik. Een DDL-trigger kan bijvoorbeeld worden geactiveerd als een instructie zoals ALTER SERVER CONFIGURATION wordt uitgevoerd of als een tabel wordt verwijderd met behulp van DROP TABLE.

CLR-trigger

In plaats van een Transact-SQL opgeslagen procedure uit te voeren, voert een CLR-trigger (Common Language Runtime) een of meer methoden uit die zijn geschreven in beheerde code die lid zijn van een assembly die is gemaakt in .NET Framework en geüpload in SQL Server.

DDL-triggers worden pas geactiveerd nadat de DDL-instructies die deze activeren, worden uitgevoerd. DDL-triggers kunnen niet worden gebruikt als INSTEAD OF-triggers. DDL-triggers worden niet geactiveerd als reactie op gebeurtenissen die van invloed zijn op lokale of globale tijdelijke tabellen en opgeslagen procedures.

DDL-triggers maken de speciale inserted en deleted tabellen niet.

De informatie over een gebeurtenis die een DDL-trigger activeert en de volgende wijzigingen die door de trigger worden veroorzaakt, worden vastgelegd met behulp van de EVENTDATA functie.

Er moeten meerdere triggers worden gemaakt voor elke DDL-gebeurtenis.

In tegenstelling tot DML-triggers (Data Manipulation Language), zijn DDL-triggers niet gericht op schema's. Daarom kunnen functies zoals OBJECT_ID, OBJECT_NAMEen OBJECTPROPERTYOBJECTPROPERTYEX kunnen niet worden gebruikt voor het opvragen van metagegevens over DDL-triggers. Gebruik in plaats daarvan de catalogusweergaven.

DDL-triggers met serverbereik worden weergegeven in de OBJECTverkenner van SQL Server Management Studio in de map Triggers . Deze map bevindt zich onder de map Serverobjecten . DDL-triggers met databasebereik worden weergegeven in de map Databasetriggers . Deze map bevindt zich onder de map Programmeerbaarheid van de bijbehorende database.

Belangrijk

Schadelijke code binnen triggers kan worden uitgevoerd onder geƫscaleerde bevoegdheden. Zie Triggerbeveiliging beheren voor meer informatie over het verminderen van deze bedreiging.

DDL-triggerbereik

DDL-triggers kunnen worden geactiveerd als reactie op een Transact-SQL gebeurtenis die is verwerkt in de huidige database of op de huidige server. Het bereik van de trigger is afhankelijk van de gebeurtenis. Een DDL-trigger die is gemaakt om te worden geactiveerd als reactie op een CREATE_TABLE gebeurtenis, kan dit bijvoorbeeld doen wanneer een CREATE_TABLE gebeurtenis plaatsvindt in de database of op het serverexemplaren. Een DDL-trigger die is gemaakt om te worden geactiveerd als reactie op een CREATE_LOGIN gebeurtenis, kan dit alleen doen wanneer er een CREATE_LOGIN gebeurtenis optreedt in het serverexemplaren.

In het volgende voorbeeld wordt de DDL-trigger safety geactiveerd wanneer een DROP_TABLE- of ALTER_TABLE-gebeurtenis in de database optreedt.

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

In het volgende voorbeeld geeft een DDL-trigger een bericht weer als er een CREATE_DATABASE gebeurtenis optreedt op de huidige serverinstantie. In het voorbeeld wordt de EVENTDATA functie gebruikt om de tekst van de bijbehorende Transact-SQL instructie op te halen. Zie De functie EVENTDATA gebruiken voor meer informatie over het gebruik EVENTDATA met DDL-triggers.

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;

De lijsten die de Transact-SQL DDL-instructies toewijzen aan de bereiken die voor hen kunnen worden opgegeven, zijn beschikbaar via de koppelingen in de sectie Selecteer een bepaalde DDL-instructie om een DDL-trigger verderop in dit artikel te activeren.

DDL-triggers met databasebereik worden opgeslagen als objecten in de database waarin ze worden gemaakt. DDL-triggers kunnen worden gemaakt in de master database en gedragen zich net als DDL-triggers die zijn gemaakt in door de gebruiker ontworpen databases. U kunt informatie over DDL-triggers verkrijgen door een query uit te voeren op de sys.triggers catalogusweergave. U kunt een query uitvoeren sys.triggers in de databasecontext waarin de triggers worden gemaakt of door de databasenaam op te geven als een id, zoals master.sys.triggers.

DDL-triggers die op serverniveau worden ingesteld, worden opgeslagen als objecten in de master-database. U kunt echter informatie verkrijgen over DDL-triggers met serverbereik door een query uit te voeren op de sys.server_triggers catalogusweergave in elke databasecontext.

Specificeer een Transact-SQL verklaring of groep verklaringen

Selecteer een bepaalde DDL-instructie om een DDL-trigger te activeren

DDL-triggers kunnen worden ontworpen om te worden geactiveerd nadat een of meer specifieke Transact-SQL instructies worden uitgevoerd. In het vorige voorbeeld wordt trigger safety geactiveerd na elke DROP_TABLE- of ALTER_TABLE-gebeurtenis. Zie DDL-gebeurtenissen voor lijsten met de Transact-SQL-instructies die kunnen worden opgegeven om een DDL-trigger te activeren en het bereik waarop de trigger kan worden geactiveerd.

Selecteer een vooraf gedefinieerde groep DDL-instructies om een DDL-trigger te activeren

Een DDL-trigger kan worden geactiveerd na uitvoering van een Transact-SQL gebeurtenis die deel uitmaakt van een vooraf gedefinieerde groepering van vergelijkbare gebeurtenissen. Als u bijvoorbeeld wilt dat een DDL-trigger wordt geactiveerd nadat een CREATE TABLE, ALTER TABLE, of DROP TABLE-instructie is uitgevoerd, kunt u FOR DDL_TABLE_EVENTS opgeven in de CREATE TRIGGER-instructie. Nadat CREATE TRIGGER wordt uitgevoerd, worden de gebeurtenissen die betrekking hebben op een gebeurtenisgroep toegevoegd aan de sys.trigger_events catalogusweergave.

Als in SQL Server 2005 (9.x) een trigger wordt gemaakt in een gebeurtenisgroep, sys.trigger_events bevat deze geen informatie over de gebeurtenisgroep, sys.trigger_events alleen informatie over de afzonderlijke gebeurtenissen die door die groep worden gedekt. sys.trigger_events bewaart metagegevens over de gebeurtenisgroep waarop de trigger is gemaakt, en ook over de afzonderlijke gebeurtenissen die door de gebeurtenisgroep worden behandeld. Wijzigingen in de gebeurtenissen die worden gedekt door gebeurtenisgroepen, zijn daarom niet van toepassing op DDL-triggers in recente versies van SQL Server die zijn gemaakt op deze gebeurtenisgroepen in SQL Server 2005 (9.x).

Zie DDL-gebeurtenisgroepen voor een lijst met vooraf gedefinieerde groepen DDL-instructies die beschikbaar zijn voor DDL-triggers, de specifieke instructies voor de gebeurtenisgroepen en de bereiken waarop deze gebeurtenisgroepen kunnen worden geprogrammeerd.

Opdracht Artikel
Hierin wordt beschreven hoe u DDL-triggers maakt, wijzigt, verwijdert of uitschakelt. DDL-triggers implementeren
Beschrijft hoe u een CLR DDL-trigger maakt. CLR-triggers maken
Beschrijft hoe u informatie over DDL-triggers retourneert. Informatie over DDL-triggers ophalen
Beschrijft hoe u informatie retourneert over een gebeurtenis die een DDL-trigger activeert met behulp van de EVENTDATA functie. De functie EVENTDATA gebruiken
Beschrijft hoe u triggerbeveiliging beheert. Triggerbeveiliging beheren