EVENTDATA (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

此函數會傳回伺服器或資料庫事件的相關資訊。 當事件通知引發,且指定的 Service Broker 收到結果時,會呼叫 EVENTDATA。 DDL 或登入觸發程序也支援在內部使用 EVENTDATA

Transact-SQL 語法慣例

Syntax

EVENTDATA( )

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

備註

只有在 DDL 或登入觸發程序內直接參考時,EVENTDATA 才會傳回資料。 如果 EVENTDATA 是由其他常式所呼叫,它便會傳回 NULL,即使那些常式是由 DDL 或登入觸發程序所呼叫亦然。

EVENTDATA 傳回的資料在以下交易之後無效:

  • 明確呼叫 EVENTDATA
  • 隱含呼叫 EVENTDATA
  • 認可
  • 會回復

警告

EVENTDATA 會傳回 XML 資料,這項資料會以 Unicode 的方式傳給用戶端,每個字元佔 2 個位元組。 EVENTDATA 會傳回可代表這些 Unicode 字碼指標的 XML:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

XML 無法表示且不允許使用 Transact-SQL 識別碼和資料中所能使用的某些字元。 有上述清單所未顯示之字碼指標的字元或資料會對應至問號 (?)。

執行 CREATE LOGINALTER LOGIN 陳述式時,不會顯示密碼。 這可以保護登入安全性。

傳回的結構描述

EVENTDATA 會傳回 xml 資料類型的值。 根據預設,所有事件的結構描述定義都會安裝在此目錄中:C:\Program Files\Microsoft SQL Server\nnn\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd。

Microsoft SQL Server XML Schemas (Microsoft SQL Server XML 結構描述) 網頁也會有事件結構描述。

若要針對任何特定的事件擷取結構描述,請搜尋複雜類型 EVENT_INSTANCE_<event_type> 的結構描述。 例如,若要擷取 DROP_TABLE 事件的結構描述,請搜尋 EVENT_INSTANCE_DROP_TABLE 的結構描述。

範例

A. 查詢 DDL 觸發程序中的事件資料

此範例會建立可防止建立新資料庫資料表的 DDL 觸發程序。 針對 EVENTDATA 所產生的 XML 資料使用 XQuery,可擷取引發觸發程序的 Transact-SQL 陳述式。 如需詳細資訊,請參閱 XQuery 語言參考 (SQL Server)

注意

當您使用 SQL Server Management Studio 中的 [以方格顯示結果] 來查詢 <TSQLCommand> 元素時,命令文字中不會出現分行符號。 請改用 [Results to Text] (以文字顯示結果)

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  

注意

若要傳回事件資料,請使用 XQuery value() 方法,不要使用 query() 方法。 query() 方法會在輸出中傳回 XML 和逸出 & 符號的歸位字元及換行字元 (CR/LF) 執行個體,value() 方法則會在輸出中將 CR/LF 轉譯為不可見。

B. 利用 DDL 觸發程序中的事件資料來建立記錄資料表

此範例會建立一份資料表來儲存和所有資料庫層級事件有關的資訊,且會以 DDL 觸發程序來擴展該資料表。 針對 EVENTDATA 所產生的 XML 資料使用 XQuery,可擷取事件類型和 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  

另請參閱

使用 EVENTDATA 函數
DDL 觸發程序
事件通知
登入觸發程序