Sdílet prostřednictvím


EVENTDATA (Transact-SQL)

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Tato funkce vrátí informace o serverových nebo databázových událostech. Když se aktivuje oznámení o události a zadaný zprostředkovatel služeb obdrží výsledky, EVENTDATA zavolá se. Aktivační událost DDL nebo přihlášení také podporuje interní použití EVENTDATA.

Transact-SQL konvence syntaxe

Syntaxe

EVENTDATA( )

Poznámky

EVENTDATA vrátí data pouze v případech, kdy se odkazuje přímo uvnitř DDL nebo triggeru přihlášení. EVENTDATA vrátí hodnotu null, pokud ji volají jiné rutiny, a to i v případě, že DDL nebo trigger přihlášení volá tyto rutiny.

Data vrácená EVENTDATA po transakci jsou neplatná.

  • explicitně volal EVENTDATA
  • volána EVENTDATA implicitně
  • commits
  • je vrácen zpět

Upozornění

EVENTDATA vrátí data XML, odeslaná klientovi jako Unicode, která pro každý znak používá 2 bajty. EVENTDATA vrátí kód XML, který může představovat tyto body kódu Unicode:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

XML nemůže vyjádřit a nepovolí některé znaky, které se mohou objevit v identifikátorech Transact-SQL a datech. Znaky nebo data obsahující body kódu, které se nezobrazují v předchozím seznamu, se mapují na otazník (?).

Při spuštění příkazů ALTER LOGIN se hesla nezobrazujíCREATE LOGIN. Tím se chrání zabezpečení přihlášení.

Vrácená schémata

FUNKCE EVENTDATA vrátí hodnotu xml datového typu. Ve výchozím nastavení se definice schématu pro všechny události instaluje v tomto adresáři: <jednotka>:\Program Files\Microsoft SQL Server\nnn\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd.

Webová stránka schémat XML serveru Microsoft SQL Server obsahuje také schéma událostí.

Chcete-li extrahovat schéma pro každou konkrétní událost, vyhledejte schéma komplexního typu EVENT_INSTANCE_<event_type>. Chcete-li například extrahovat schéma události DROP_TABLE , vyhledejte schéma EVENT_INSTANCE_DROP_TABLE.

Příklady

A. Dotazování na data událostí v triggeru DDL

Tento příklad vytvoří trigger DDL, který brání vytvoření nových databázových tabulek. Použití XQuery pro data XML vygenerovaná zachycením EVENTDATA příkazu Transact-SQL, který trigger aktivuje. Další informace najdete v referenční dokumentaci jazyka XQuery (SQL Server).

Poznámka:

Při použití funkce Výsledky k mřížce v aplikaci SQL Server Management Studio k dotazování prvku <TSQLCommand> se řádky v textu příkazu nezobrazí. Místo toho použijte výsledky k textu .

USE AdventureWorks2022;  
GO  
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  
;  
GO  
--Test the trigger.  
CREATE TABLE NewTable (Column1 INT);  
GO  
--Drop the trigger.  
DROP TRIGGER safety  
ON DATABASE;  
GO  

Poznámka:

Pokud chcete vrátit data události, použijte místo metody query() metodu XQuery value(). Metoda query() vrátí ve výstupu instance návratu na začátek řádku a odřádkování (CR/LF), zatímco metoda value() vykresluje instance CR/LF neviditelné ve výstupu.

B. Vytvoření tabulky protokolu s daty událostí v triggeru DDL

Tento příklad vytvoří tabulku pro úložiště informací o všech událostech na úrovni databáze a naplní tuto tabulku triggerem DDL. Použití XQuery pro data XML vygenerovaná zachycením EVENTDATA typu události a příkazu Transact-SQL.

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  
--Drop the trigger.  
DROP TRIGGER log  
ON DATABASE;  
GO  
--Drop table ddl_log.  
DROP TABLE ddl_log;  
GO  

Viz také

Použití funkce EVENTDATA
Spouště DDL
Oznámení událostí
Spouštěče přihlášení k systému