EVENTDATA (Transact-SQL)

サーバーまたはデータベースのイベントに関する情報を返します。EVENTDATA は、イベント通知が起動されると呼び出され、その結果は指定された Service Broker に返されます。EVENTDATA は、DDL トリガーまたはログオン トリガーの内部でも使用できます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

EVENTDATA( )

説明

EVENTDATA は、DDL トリガーまたはログオン トリガーの内部で直接参照された場合のみ、データを返します。それ以外のルーチンで呼び出された EVENTDATA は、そのルーチンの呼び出し元が DDL トリガーまたはログオン トリガーであっても、NULL を返します。

EVENTDATA から返されたデータは、EVENTDATA を呼び出したトランザクションが暗黙的または明示的にコミットまたはロールバックを実行するまで有効となりません。

注記注意

EVENTDATA は XML データを返します。このデータは、1 文字に 2 バイトを使用する Unicode としてクライアントに送信されます。次の Unicode コード ポイントは、EVENTDATA から返される XML で表現することができます。

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

Transact-SQL の識別子やデータで使用できる文字の中には、XML で表現できないものや許可されていないものがあります。上記の一覧に含まれていないコード ポイントを含んでいる文字やデータは、疑問符 (?) にマップされます。

返されるスキーマ

EVENTDATA は、xml 型の値を返します。既定で、すべてのイベントのスキーマ定義は、C:\Program Files\Microsoft SQL Server\100\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd ディレクトリにインストールされます。

また、Microsoft SQL Server XML スキーマの Web ページでイベント スキーマが公開されています。

特定のイベントのスキーマを抽出するには、複合型 EVENT_INSTANCE_<event_type> のスキーマを検索します。たとえば、DROP_TABLE イベントのスキーマを抽出するには、EVENT_INSTANCE_DROP_TABLE のスキーマを検索します。

A. DDL トリガーでイベント データをクエリする

次の例では、DDL トリガーを作成して、データベースに新しいテーブルが作成されないようにします。トリガーを起動する Transact-SQL ステートメントは、EVENTDATA によって生成される XML データに対して XQuery を使用することでキャプチャされます。詳細については、「XQuery 言語リファレンス (データベース エンジン)」を参照してください。

注意

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 およびアンパサンドでエスケープされる復帰と改行 (CR/LF) インスタンスが出力に返されます。一方 value() メソッドでは、CR/LF インスタンスが出力に返されますが、表示はされません。

B. DDL トリガーでイベント データを含んだログ テーブルを作成する

次の例では、データベース レベルのすべてのイベントに関する情報を格納するテーブルを作成し、DDL トリガーでそのテーブルにデータを設定します。イベントの種類および Transact-SQL ステートメントは、EVENTDATA によって生成される XML データに対して XQuery を使用することでキャプチャされます。

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.