Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
SQL-adatbázis a Microsoft Fabricben
A DDL különböző adatdefiníciós nyelvi (DDL-) eseményekre reagálva aktiválódik. Ezek az események elsősorban Transact-SQL olyan utasításoknak felelnek meg, amelyek a kulcsszavakkal CREATE, ALTER, DROP, GRANT, DENY, REVOKE vagy UPDATE STATISTICS kezdődnek. Bizonyos, DDL-hez hasonló műveleteket végző rendszer által tárolt eljárások DDL-eseményindítókat is aktiválhatnak.
DDL-eseményindítókat akkor használjon, ha a következő feladatokat szeretné elvégezni:
- Az adatbázisséma bizonyos módosításainak megakadályozása.
- Az adatbázis sémájának változására válaszul történjen valami az adatbázisban.
- Változások vagy események rögzítése az adatbázissémában.
Fontos
Tesztelje a DDL-eseményindítókat a futtatott rendszer által tárolt eljárásokra adott válaszok meghatározásához. Az CREATE TYPE utasítás és a sp_addtype tárolt eljárás például mindkettő elindít egy DDL trigger-t, amely egy CREATE_TYPE eseményen jött létre.
A DDL-eseményindító típusai
Transact-SQL eseményindító
Egy speciális Transact-SQL tárolt eljárás, amely egy vagy több Transact-SQL utasítást hajt végre egy kiszolgáló- vagy adatbázis-hatókörű eseményre válaszul. Egy DDL-eseményindító például akkor aktiválható, ha egy utasítást ALTER SERVER CONFIGURATION végrehajtanak, vagy ha egy táblát törölnek a használatával DROP TABLE.
CLR-eseményindító
A Transact-SQL tárolt eljárás végrehajtása helyett egy közös nyelvi futtatókörnyezeti eseményindító (CLR) egy vagy több felügyelt kódban írt metódust hajt végre, amelyek a .NET-keretrendszerben létrehozott és az SQL Serverbe feltöltött szerelvény tagjai.
A DDL triggerek csak az őket kiváltó DDL-utasítások futtatása után aktiválódnak. A DDL eseményindítók nem használhatók INSTEAD OF eseményindítóként. A DDL-eseményindítók nem aktiválhatók a helyi vagy globális ideiglenes táblákat és tárolt eljárásokat érintő eseményekre válaszul.
A DDL-eseményindítók nem hozzák létre a speciális inserted és deleted a táblákat.
A DDL-eseményindítót aktiváló esemény adatait és az eseményindító által okozott későbbi módosításokat a EVENTDATA függvény rögzíti.
Minden DDL-eseményhez több eseményindítót kell létrehozni.
Az Adatmanipulációs nyelv (DML) eseményindítóitól eltérően a DDL-eseményindítók nem tartoznak a sémák hatókörébe. Ezért az olyan függvények, mint OBJECT_IDa , OBJECT_NAMEOBJECTPROPERTYés OBJECTPROPERTYEX nem használhatók a DDL-eseményindítók metaadatainak lekérdezéséhez. Használja inkább a katalógusnézeteket.
A kiszolgálói hatókörű DDL-eseményindítók az SQL Server Management Studio Object Explorerben jelennek meg az Eseményindítók mappában. Ez a mappa a Kiszolgálóobjektumok mappa alatt található. Az adatbázis-hatókörű DDL-eseményindítók az Adatbázis-eseményindítók mappában jelennek meg. Ez a mappa a megfelelő adatbázis Programozhatóság mappájában található.
Fontos
Az eseményindítókon belüli rosszindulatú kódok eszkalált jogosultságok alatt futtathatók. A fenyegetés csökkentésének módjáról további információt az eseményindítók biztonságának kezelése című témakörben talál.
DDL-eseményindító hatóköre
A DDL-eseményindítók az aktuális adatbázisban vagy az aktuális kiszolgálón feldolgozott Transact-SQL eseményre reagálva aktiválhatók. Az eseményindító hatóköre az eseménytől függ. Az CREATE_TABLE eseményre reagálásra létrehozott DDL-trigger például aktiválódhat, amikor CREATE_TABLE esemény történik az adatbázisban vagy a szerver példányon. Egy DDL-eseményindító, amelyet egy CREATE_LOGIN eseményre való reagálásra hoztak létre, csak akkor tud aktiválódni, amikor egy CREATE_LOGIN esemény történik a kiszolgálópéldányban.
Az alábbi példában a DDL trigger safety aktiválódik minden alkalommal, amikor egy DROP_TABLE vagy ALTER_TABLE esemény történik az adatbázisban.
CREATE TRIGGER safety
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS PRINT 'You must disable trigger "safety" to drop or alter tables!';
ROLLBACK;
A következő példában egy DDL-eseményindító kinyomtat egy üzenetet, ha bármilyen CREATE_DATABASE esemény történik az aktuális kiszolgálópéldányon. A példa a EVENTDATA függvény használatával kéri le a megfelelő Transact-SQL utasítás szövegét. További információért arról, hogyan használható a EVENTDATA DDL trigger-ekkel, lásd: Az EVENTDATA függvény használata.
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;
Azok a listák, amelyek a Transact-SQL utasításokat a számukra megadható hatókörökhöz rendelik, az adott DDL-utasítás kiválasztása szakasz hivatkozásain keresztül érhetők el a cikk későbbi részében található DDL-eseményindítók indításához .
Az adatbázis-hatókörű DDL-eseményindítók objektumként vannak tárolva abban az adatbázisban, amelyben létrehozták őket. A DDL-eseményindítók létrehozhatóak az master adatbázisban, és ugyanúgy viselkedhetnek, mint a felhasználó által tervezett adatbázisokban. A katalógusnézet lekérdezésével információkat szerezhet be a sys.triggers DDL-eseményindítókról. Az adatbázis-környezeten belül lekérdezheti sys.triggers az eseményindítókat, vagy megadhatja az adatbázis nevét azonosítóként, például master.sys.triggers.
A kiszolgálói hatókörű DDL-eseményindítók objektumként vannak tárolva az master adatbázisban. A kiszolgálói hatókörű DDL-eseményindítókról azonban bármilyen adatbázis-környezetben lekérdezheti a sys.server_triggers katalógusnézetet.
Transact-SQL utasítás vagy utasításcsoport megadása
Válasszon ki egy adott DDL-utasítást egy DDL-eseményindító elindításához
A DDL-triggerek úgy tervezhetők, hogy egy vagy több konkrét Transact-SQL utasítás futtatása után aktiválódnak. Az előző példában a safety trigger bármelyik DROP_TABLE vagy ALTER_TABLE esemény után aktiválódik. A DDL-eseményindítók indításához megadható Transact-SQL utasítások listáját és az eseményindító indításának hatókörét lásd: DDL-események.
DDL-eseményindító indításához válasszon egy előre definiált DDL-utasításcsoportot
A DDL-eseményindítók bármely olyan Transact-SQL esemény végrehajtása után aktiválhatók, amelyek hasonló események előre definiált csoportosításához tartoznak. Ha például azt szeretné, hogy egy DDL eseményindító bármelyik CREATE TABLE, ALTER TABLE vagy DROP TABLE utasítás futtatása után aktiválódjon, megadhatja a FOR DDL_TABLE_EVENTS az CREATE TRIGGER utasításban. Az CREATE TRIGGER futtatása után az eseménycsoport által lefedett események bekerülnek a sys.trigger_events katalógusnézetbe.
Az SQL Server 2005 -ben (9.x) ha eseménycsoporton hoz létre eseményindítót, sys.trigger_events nem tartalmaz információkat az eseménycsoportról, sys.trigger_events csak az adott csoport által érintett egyes eseményekről tartalmaz információkat.
sys.trigger_events metaadatokat őriz meg az eseménycsoportról, amelyen az eseményindító létrejön, valamint az eseménycsoport által lefedett egyes eseményekről. Ezért az eseménycsoportok által érintett események módosításai nem vonatkoznak az SQL Server legutóbbi verzióiban létrehozott DDL-eseményindítókra az SQL Server 2005-ben ezen eseménycsoportokon (9.x).
A DDL-eseményindítókhoz elérhető DDL-utasítások előre definiált csoportjainak, az eseménycsoportok által lefedett konkrét utasításoknak és az eseménycsoportok programozott hatóköreinek listáját lásd: DDL Eseménycsoportok.
Kapcsolódó tevékenységek
| Feladatok | Cikk |
|---|---|
| A DDL-eseményindítók létrehozásának, módosításának, törlésének vagy letiltásának módját ismerteti. | DDL-triggerek implementálása |
| A CLR DDL-eseményindítók létrehozásának módját ismerteti. | CLR-eseményindítók létrehozása |
| A DDL-eseményindítókra vonatkozó információk visszaküldésének módját ismerteti. | DDL-eseményindítók adatainak lekérése |
Ismerteti, hogyan lehet egy DDL-trigger aktiválását okozó eseményről információt visszanyerni a EVENTDATA függvény használatával. |
Az EVENTDATA függvény használata |
| Az eseményindítók biztonságának kezelését ismerteti. | Eseményindító biztonságának kezelése |