Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance
Azure SQLDatabáze SQL v Microsoft Fabric
DDL spouštěče se aktivují v reakci na různé události jazyka pro definici dat (DDL, Data Definition Language). Tyto události primárně odpovídají Transact-SQL příkazům, které začínají klíčovými slovy CREATE, ALTER, DROP, GRANT, DENY, REVOKE nebo UPDATE STATISTICS. Některé systémové uložené procedury, které provádějí operace podobné DDL, mohou také aktivovat triggery DDL.
Triggery DDL použijte, když chcete provést následující úlohy:
- Zabraňte určitým změnám schématu databáze.
- Došlo k něčemu v databázi jako reakce na změnu schématu databáze.
- Zaznamená změny nebo události ve schématu databáze.
Důležité
Otestujte triggery DDL a určete jejich odpovědi na spuštěné systémové uložené procedury. Například příkaz CREATE TYPE i uložená sp_addtype procedura aktivují trigger DDL, který se vytvoří v CREATE_TYPE události.
Typy triggeru DDL
spouštěč Transact-SQL
Speciální typ Transact-SQL uložené procedury, která spouští jeden nebo více příkazů Transact-SQL v reakci na událost s oborem serveru nebo databáze. Trigger DDL se například může aktivovat, pokud se spustí příkaz jako ALTER SERVER CONFIGURATION, nebo pokud je tabulka odstraněna pomocí DROP TABLE.
CLR trigger
Místo spuštění Transact-SQL uložené procedury trigger CLR (Common Language Runtime) spustí jednu nebo více metod napsaných ve spravovaném kódu, které jsou členy sestavení vytvořeného v rozhraní .NET Framework a nahrané na SQL Serveru.
Triggery DDL se spouštějí až po spuštění příkazů DDL, které je aktivují. Triggery DDL se nedají použít jako INSTEAD OF triggery. Triggery DDL se neaktivují v reakci na události, které ovlivňují místní nebo globální dočasné tabulky a uložené procedury.
Triggery DDL nevytvoří speciální inserted a deleted tabulky.
Informace o události, která aktivuje trigger DDL a následné změny způsobené triggerem, se zaznamenávají pomocí EVENTDATA funkce.
Pro každou událost DDL se vytvoří více triggerů.
Na rozdíl od triggerů jazyka DML (Data Manipulation Language) nejsou triggery DDL vymezeny na schémata. Proto se funkce, jako OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, a OBJECTPROPERTYEX nelze použít k dotazování informací o DDL triggerech. Místo toho použijte zobrazení katalogu.
Triggery DDL v oboru serveru se zobrazí v Průzkumníku objektů aplikace SQL Server Management Studio ve složce Aktivační události . Tato složka se nachází ve složce Objekty serveru . Triggery DDL v oboru databáze se zobrazují ve složce Triggery databáze . Tato složka se nachází ve složce Programovatelnost odpovídající databáze.
Důležité
Škodlivý kód uvnitř triggerů může běžet pod eskalovanými oprávněními. Další informace o tom, jak pomoci snížit tuto hrozbu, najdete v tématu Správa zabezpečení triggeru.
Rozsah triggeru DDL
Triggery DDL se můžou aktivovat v reakci na událost Transact-SQL zpracovávanou v aktuální databázi nebo na aktuálním serveru. Rozsah triggeru závisí na události. Například trigger DDL vytvořený k aktivaci v reakci na CREATE_TABLE událost se může spustit vždy, když v databázi nebo instanci serveru nastane CREATE_TABLE událost. Trigger DDL vytvořený k aktivaci v reakci na CREATE_LOGIN událost může být spuštěn pouze tehdy, když dojde k události CREATE_LOGIN v instanci serveru.
V následujícím příkladu se trigger DDL safety aktivuje při každém výskytu události DROP_TABLE nebo ALTER_TABLE v databázi.
CREATE TRIGGER safety
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS PRINT 'You must disable trigger "safety" to drop or alter tables!';
ROLLBACK;
V následujícím příkladu trigger DDL vytiskne zprávu, pokud dojde k nějaké CREATE_DATABASE události v aktuální instanci serveru. Příklad používá EVENTDATA funkci k načtení textu odpovídajícího příkazu Transact-SQL. Další informace o použití EVENTDATA s triggery DDL naleznete v tématu Použití funkce 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;
Seznamy, které mapují příkazy Transact-SQL na obory, které lze pro ně zadat, jsou k dispozici prostřednictvím odkazů uvedených v části Výběr konkrétního příkazu DDL pro aktivaci triggeru DDL dále v tomto článku.
Triggery DDL v rozsahu databáze jsou ukládány jako objekty v databázi, kde jsou vytvořeny. Triggery DDL je možné vytvořit v master databázi a chovat se stejně jako ty vytvořené v uživatelsky navržených databázích. Informace o triggerech DDL můžete získat dotazováním na zobrazení katalogu sys.triggers. Můžete se dotazovat sys.triggers v kontextu databáze, ve kterém jsou triggery vytvořeny, nebo zadáním názvu databáze jako identifikátoru, například master.sys.triggers.
DDL triggery s působností na serveru se ukládají jako objekty v master databázi. Informace o triggerech DDL v rozsahu serveru však můžete získat provedením dotazu na sys.server_triggers zobrazení katalogu v libovolném kontextu databáze.
Určete příkaz Transact-SQL nebo skupinu příkazů
Výběr konkrétního příkazu DDL pro aktivaci triggeru DDL
Triggery DDL je možné navrhnout tak, aby se aktivovaly po spuštění jednoho nebo více konkrétních příkazů Transact-SQL. V předchozím příkladu dojde k aktivaci safety po jakékoli události DROP_TABLE nebo ALTER_TABLE. Seznam příkazů Transact-SQL, které je možné zadat k aktivaci triggeru DDL, a rozsah, ve kterém se trigger může aktivovat, najdete v tématu Události DDL.
Vyberte předdefinovanou skupinu příkazů DDL pro aktivaci triggeru DDL.
Trigger DDL se může aktivovat po spuštění jakékoli Transact-SQL události, která patří do předdefinovaného seskupení podobných událostí. Pokud například chcete, aby se trigger DDL aktivoval po spuštění libovolného CREATE TABLEpříkazu , ALTER TABLEnebo DROP TABLE příkazu, můžete v FOR DDL_TABLE_EVENTS příkazu zadatCREATE TRIGGER. Po spuštění CREATE TRIGGER jsou události, na které se vztahuje skupina událostí, přidány do zobrazení katalogu sys.trigger_events.
Pokud se v SQL Serveru 2005 (9.x) vytvoří trigger ve skupině událostí, sys.trigger_events neobsahuje informace o této skupině událostí, sys.trigger_events včetně informací pouze o jednotlivých událostech, které tato skupina pokrývá.
sys.trigger_events zachovává metadata o skupině událostí, na které se trigger vytvoří, a také o jednotlivých událostech, které skupina událostí pokrývá. Změny událostí, které jsou pokryty skupinami událostí, se proto nevztahují na triggery DDL v posledních verzích SQL Serveru, které jsou vytvořeny v těchto skupinách událostí v SQL Serveru 2005 (9.x).
Seznam předdefinovaných skupin příkazů DDL, které jsou k dispozici pro triggery DDL, konkrétní příkazy, které skupiny událostí pokrývají, a rozsahy, ve kterých se tyto skupiny událostí dají naprogramovat, najdete v tématu Skupiny událostí DDL.
Související úkoly
| Úkol | Článek |
|---|---|
| Popisuje, jak vytvářet, upravovat, odstraňovat nebo zakázat triggery DDL. | Implementace triggerů DDL |
| Popisuje, jak vytvořit trigger CLR DDL. | Vytváření triggerů CLR |
| Popisuje, jak vrátit informace o triggerech DDL. | Získání informací o triggerech DDL |
Popisuje, jak vrátit informace o události, která aktivuje trigger DDL pomocí EVENTDATA funkce. |
Použití funkce EVENTDATA |
| Popisuje, jak spravovat zabezpečení triggerů. | Správa zabezpečení triggerů |
Související obsah
- DML spouště
- Spouštěče přihlášení
- VYTVOŘIT SPOUŠŤ (Transact-SQL)
- EVENTDATA (Transact-SQL)