EVENTDATA (Transact-SQL)

更新: 2006 年 12 月 12 日

傳回伺服器或資料庫事件的相關資訊。EVENTDATA 是在引發事件通知之時呼叫的,結果會傳回指定的 Service Broker。EVENTDATA 也可以用在 DDL 或登入觸發程序主體內。

主題連結圖示Transact-SQL 語法慣例

語法

EVENTDATA( )

備註

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

在呼叫 EVENTDATA 的交易之後,EVENTDATA 傳回的資料便告無效,可能是明確或隱含地認可或回復。

ms173781.Caution(zh-tw,SQL.90).gif注意:
EVENTDATA 會傳回 XML 資料。這項資料會以 Unicode 的方式傳給用戶端,每個字元佔 2 個位元組。下列 Unicode 字碼指標可以用 EVENTDATA 傳回的 XML 來表示: 0x0009 0x000A 0x000D >= 0x0020 && <= 0xD7FF >= 0xE000 && <= 0xFFFD 在 XML 中,無法表示或不允許使用 Transact-SQL 識別碼和資料所能使用的某些字元。有上述清單所未顯示之字碼指標的字元或資料會對應至問號 (?)。

傳回的結構描述

EVENTDATA 會傳回 xml 類型的值。針對每個事件傳回的結構描述由 <EVENT_INSTANCE> 元素內之巢狀元素構成。若要取得針對事件而傳回的結構描述,請利用 [索引] 或 [搜尋],在《SQL Server 線上叢書》中尋找事件主題。列出的事件屬性名稱對應於結構描述中所傳回的元素,但下列情況例外:

  • EVENTDATA 會傳回 <ServerName> 元素,而不是 <SQLInstance><ComputerName>
  • EVENTDATA 會傳回其他 <EventType> 元素。

例如,ALTER_TABLE 事件會傳回下列結構描述:

<EVENT_INSTANCE>
    <EventType>type</EventType>
    <PostTime>date-time</PostTime>
    <SPID>spid</SPID>
    <ServerName>name</ServerName>
    <LoginName>name</LoginName>
    <UserName>name</UserName>
    <DatabaseName>name</DatabaseName>
    <SchemaName>name</SchemaName>
    <ObjectName>name</ObjectName>
    <ObjectType>type</ObjectType>
    <TSQLCommand>command</TSQLCommand>
</EVENT_INSTANCE>

範例

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

下列範例會建立一個 DDL 觸發程序來防止在資料庫中建立新的資料表。引發觸發程序的 Transact-SQL 陳述式是利用 XQuery 針對 EVENTDATA 所產生的 XML 資料來擷取的。如需詳細資訊,請參閱<對 XML 資料類型進行 XQuery>。

ms173781.note(zh-tw,SQL.90).gif附註:
當您利用 SQL Server Management Studio 中的 [以方格顯示結果] 來查詢 <TSQLCommand> 元素時,命令文字中不會出現分行符號。請改用 [以文字顯示結果]
USE AdventureWorks;
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
ms173781.note(zh-tw,SQL.90).gif附註:
當您要傳回事件資料時,我們建議您使用 query() 方法的 XQuery value() 方法。query() 方法會在輸出中傳回 XML 和 ampersand 逸出歸位字元及換行字元 (CR/LF) 執行個體,value() 方法則會將 CR/LF 執行個體轉譯成在輸出中不可見。

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

下列範例會建立一份資料表來儲存有關所有資料庫層級事件的資訊,且會以 DDL 觸發程序來擴展資料表。事件類型和 Transact-SQL 陳述式是利用 XQuery 針對 EVENTDATA 所產生的 XML 資料來擷取的。

USE AdventureWorks;
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 觸發程序
設計事件通知

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2006 年 12 月 12 日

新增內容:
  • 新增 EVENTDATA 也可以用在登入觸發程序主體內。登入觸發程序是 SQL Server Service Pack 2 加入的新功能。