EVENTDATA (Transact-SQL)
傳回伺服器或資料庫事件的相關資訊。EVENTDATA 是在引發事件通知之時呼叫的,結果會傳回指定的 Service Broker。EVENTDATA 也可以用在 DDL 或登入觸發程序主體內。
語法
EVENTDATA( )
備註
只有在 DDL 或登入觸發程序內直接參考時,EVENTDATA 才會傳回資料。如果 EVENTDATA 是由其他常式所呼叫,它便會傳回 NULL,即使這些常式是由 DDL 或登入觸發程序所呼叫亦然。
在呼叫 EVENTDATA 的交易之後,EVENTDATA 傳回的資料便告無效,可能是明確或隱含地認可或回復。
注意 |
---|
EVENTDATA 會傳回 XML 資料。這項資料會以 Unicode 的方式傳給用戶端,每個字元佔 2 個位元組。下列 Unicode 字碼指標可以用 EVENTDATA 傳回的 XML 來表示: 0x0009 0x000A 0x000D >= 0x0020 && <= 0xD7FF >= 0xE000 && <= 0xFFFD 在 XML 中,無法表示或不允許使用 Transact-SQL 識別碼和資料所能使用的某些字元。有上述清單所未顯示之字碼指標的字元或資料會對應至問號 (?)。 |
傳回的結構描述
EVENTDATA 會傳回 xml 類型的值。根據預設,所有事件的結構描述定義都會安裝在以下目錄:C:\Program Files\Microsoft SQL Server\100\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd。
或者,事件結構描述會在 Microsoft SQL Server XML 結構描述 (英文) 網頁中發行。
若要針對任何特定的事件擷取結構描述,請搜尋複雜類型 EVENT_INSTANCE_<event_type> 的結構描述。例如,若要擷取 DROP_TABLE 事件的結構描述,請搜尋 EVENT_INSTANCE_DROP_TABLE 的結構描述。
範例
A. 查詢 DDL 觸發程序中的事件資料
下列範例會建立一個 DDL 觸發程序來防止在資料庫中建立新的資料表。引發觸發程序的 Transact-SQL 陳述式是利用 XQuery 針對 EVENTDATA 所產生的 XML 資料來擷取的。如需詳細資訊,請參閱<XQuery 語言參考 (Database Engine)>。
[!附註]
當您利用 SQL Server Management Studio 中的 [以方格顯示結果] 來查詢 <TSQLCommand> 元素時,命令文字中不會出現分行符號。請改用 [以文字顯示結果]。
USE AdventureWorks2008R2;
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
[!附註]
當您要傳回事件資料時,我們建議您使用 query() 方法的 XQuery value() 方法。query() 方法會在輸出中傳回 XML 和 ampersand 逸出歸位字元及換行字元 (CR/LF) 執行個體,value() 方法則會將 CR/LF 執行個體轉譯成在輸出中不可見。
B. 利用 DDL 觸發程序中的事件資料來建立記錄資料表
下列範例會建立一份資料表來儲存有關所有資料庫層級事件的資訊,且會以 DDL 觸發程序來擴展資料表。事件類型和 Transact-SQL 陳述式是利用 XQuery 針對 EVENTDATA 所產生的 XML 資料所擷取。
USE AdventureWorks2008R2;
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
C. 針對部分結構描述驗證事件執行個體
下列範例會針對 EVENTDATA 傳回的結構描述驗證 DROP_TABLE 事件。
IF EXISTS (SELECT * FROM sys.xml_schema_collections WHERE name='EventsXML')
DROP XML SCHEMA COLLECTION EventsXML ;
GO
DECLARE @x xml
SET @x = (SELECT * FROM OPENROWSET(BULK 'c:\Program Files\Microsoft SQL Server\90\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd', single_clob) AS x)
CREATE XML SCHEMA COLLECTION EventsXML AS @x ;
GO
DECLARE @x xml(XSDEVENTS)
DECLARE @y xml
DECLARE @n nvarchar(max)
SELECT @y = EVENTDATA()
SELECT @n = @y
SELECT @n = REPLACE(@n, '<EVENT_INSTANCE', '<EVENT_INSTANCE xmlns=''https://schemas.microsoft.com/sqlserver/2006/eventdata'' xmlns:xsi=''http://www.w3.org/2001/XMLSchema-instance'' xsi:type=''EVENT_INSTANCE_DROP_TABLE''')
SELECT @x = @n -- This causes the validation.