EVENTDATA (Transact-SQL)

更新 : 2006 年 12 月 12 日

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

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

構文

EVENTDATA( )

解説

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

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

ms173781.Caution(ja-jp,SQL.90).gif注意 :
EVENTDATA は XML データを返します。このデータは、1 文字に 2 バイトを使用する Unicode としてクライアントに送信されます。次の Unicode コード ポイントは、EVENTDATA から返される XML で表現することができます。 0x0009 0x000A 0x000D >= 0x0020 && <= 0xD7FF >= 0xE000 && <= 0xFFFD Transact-SQL の識別子やデータで使用できる文字の中には、XML で表現できないものや許可されていないものがあります。上記の一覧に含まれていないコード ポイントを含んでいる文字やデータは、疑問符 (?) にマップされます。

返されるスキーマ

EVENTDATA は、xml 型の値を返します。各イベントに返されるスキーマは、<EVENT_INSTANCE> 要素の内部で入れ子になっている要素から構成されます。イベントに対して返されるスキーマについては、SQL Server Books Online で索引または検索を使用して、そのイベントのトピックを参照してください。イベントについて記載されているプロパティ名は、次の例外を除き、スキーマ内の返される要素に対応しています。

  • EVENTDATA は <SQLInstance> および <ComputerName> の代わりに <ServerName> 要素を返します。
  • 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 ステートメントは、EVENTDATA によって生成される XML データに対して XQuery を使用することでキャプチャされます。詳細については、「xml データ型に対する XQuery」を参照してください。

ms173781.note(ja-jp,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(ja-jp,SQL.90).gifメモ :
イベント データを返す場合は、query() メソッドの代わりに XQuery の value() を使用してください。query() メソッドでは、XML およびアンパサンドでエスケープされる復帰と改行 (CR/LF) インスタンスが出力に返されます。一方 value() メソッドでは、CR/LF インスタンスが出力に返されますが、表示はされません。

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

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

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 で導入されています。