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-eseményindítót aktiváló esemény adatait az EVENTDATA függvény rögzíti. Ez a függvény egy xml értéket ad vissza. Az XML-séma az alábbiakra vonatkozó információkat tartalmazza:
Az esemény időpontja.
A kapcsolat munkamenet-azonosítója (SPID) az eseményindító végrehajtásakor.
Az eseményindítót aktiváló esemény típusa.
Az esemény típusától függően a séma további információkat tartalmaz, például azt az adatbázist, amelyben az esemény történt, az objektumot, amelynél az esemény történt, valamint az esemény Transact-SQL utasítását. További információ: DDL triggerek.
A következő DDL-eseményindító például a AdventureWorks2025 mintaadatbázisban jön létre:
CREATE TRIGGER safety
ON DATABASE
FOR CREATE_TABLE
AS
PRINT 'CREATE TABLE Issued.'
SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
RAISERROR ('New tables cannot be created in this database.', 16, 1)
ROLLBACK
;
Ezután a következő CREATE TABLE utasítás fut:
CREATE TABLE NewTable (Column1 int);
A DDL-eseményindító EVENTDATA() utasítása rögzíti a nem engedélyezett CREATE TABLE utasítás szövegét. Az EVENTDATA által létrehozott xml adatokra vonatkozó XQuery-utasítás segítségével érhetjük el, hogy beolvassuk a <CommandText> elemet. További információ: XQuery Language Reference (SQL Server).
Figyelem
Az EVENTDATA rögzíti CREATE_SCHEMA események adatait, valamint a megfelelő CREATE SCHEMA definíció <schema_element>, ha van ilyen. Az EVENTDATA emellett külön eseményként ismeri fel a <schema_element> definíciót. Ezért egy CREATE_SCHEMA eseményen létrehozott DDL-eseményindító és a CREATE SCHEMA definíciójának <schema_element> által képviselt esemény kétszer is visszaadhatja ugyanazokat az eseményadatokat, például a TSQLCommand adatokat. Vegyük például a CREATE_SCHEMA és CREATE_TABLE eseményeken létrehozott DDL-eseményindítót, és a következő köteg fut:
CREATE SCHEMA s
CREATE TABLE t1 (col1 int)
Ha az alkalmazás lekéri a CREATE_TABLE esemény TSQLCommand adatait, vegye figyelembe, hogy ezek az adatok kétszer is megjelenhetnek: egyszer, amikor a CREATE_SCHEMA esemény bekövetkezik, és ismét, amikor az CREATE_TABLE esemény bekövetkezik. Ne hozzon létre DDL-eseményindítókat a CREATE_SCHEMA eseményeken és a megfelelő CREATE SCHEMA-definíciók <schema_element> szövegén, vagy hozzon létre logikát az alkalmazásba, hogy ugyanazt az eseményt ne dolgozza fel kétszer.
ALTER TABLE és ALTER DATABASE események
A ALTER_TABLE és ALTER_DATABASE események eseményadatai tartalmazzák a DDL utasítás által érintett egyéb objektumok nevét és típusait, valamint az ezeken az objektumokon végrehajtott műveletet is. Az ALTER_TABLE eseményadatok tartalmazzák az ALTER TABLE utasítás által érintett oszlopok, korlátozások vagy triggerek nevét, valamint az érintett objektumokon végrehajtott műveletet (létrehozás, módosítás, elvetés, engedélyezés vagy letiltás). Az ALTER_DATABASE eseményadatok tartalmazzák az ALTER DATABASE utasítás által érintett fájlok vagy fájlcsoportok nevét, valamint az érintett objektumokon végrehajtott műveletet (létrehozás, módosítás vagy elvetés).
Hozza létre például a következő DDL-eseményindítót az AdventureWorks mintaadatbázisban:
CREATE TRIGGER ColumnChanges
ON DATABASE
FOR ALTER_TABLE
AS
-- Detect whether a column was created/altered/dropped.
SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)')
RAISERROR ('Table schema cannot be modified in this database.', 16, 1);
ROLLBACK;
Ezután hajtsa végre a következő ALTER TABLE utasítást, amely megsért egy kényszert:
ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date;
A DDL-eseményindító EVENTDATA() utasítása rögzíti a nem engedélyezett ALTER TABLE utasítás szövegét.
Példa
Az EVENTDATA függvénnyel eseménynaplót hozhat létre. Az alábbi példában egy tábla jön létre az eseményinformációk tárolására. Ezután létrejön egy DDL-eseményindító az aktuális adatbázisban, amely feltölti a táblát az alábbi információkkal, amikor bármilyen adatbázisszintű DDL-esemény történik:
Az esemény időpontja (a GETDATE függvény használatával).
Az adatbázis-felhasználó, akinek a munkamenetében az esemény történt (a CURRENT_USER függvény használatával).
Az esemény típusa.
Az eseményt alkotó Transact-SQL utasítás.
Az utolsó két elemet ismét xQuery használatával rögzíti a rendszer az EVENTDATA által létrehozott xml- adatokon.
USE AdventureWorks2022;
GO
CREATE TABLE ddl_log (PostTime datetime, DB_User nvarchar(100), Event nvarchar(100), TSQL nvarchar(2000));
GO
CREATE TRIGGER log
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
DECLARE @data XML
SET @data = EVENTDATA()
INSERT ddl_log
(PostTime, DB_User, Event, TSQL)
VALUES
(GETDATE(),
CONVERT(nvarchar(100), CURRENT_USER),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
GO
--Test the trigger
CREATE TABLE TestTable (a int)
DROP TABLE TestTable ;
GO
SELECT * FROM ddl_log ;
GO
Jegyzet
Az eseményadatok visszaadásához javasoljuk, hogy az XQuery metódust használja a lekérdezés() metódus helyett. A query() metódus a kimenetben XML- és ampersandként kódolt kocsivissza- és újsor (CRLF) példányait adja vissza, míg a érték() metódus láthatatlanná teszi a CRLF példányokat a kimenetben.
A AdventureWorks2025 mintaadatbázishoz hasonló DDL-eseményindító-példa érhető el. A példa beszerzéséhez keresse meg az Adatbázis-eseményindítók mappát az SQL Server Management Studióval. Ez a mappa az AdventureWorks2025 adatbázis Programmability mappájában található. Kattintson a jobb gombbal ddlDatabaseTriggerLog elemre, és válassza szkriptadatbázis-eseményindítót. Alapértelmezés szerint a DDL-eseményindító ddlDatabaseTriggerLog le van tiltva.
Lásd még:
DDL-események
DDL-eseménycsoportok