EVENTDATA (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

この関数は、サーバーまたはデータベースのイベントに関する情報を返します。 イベント通知が発生し、指定されたサービス ブローカーが結果を受け取ると、EVENTDATA が呼び出されます。 DDL またはログオン トリガーも、EVENTDATA の内部使用をサポートしています。

Transact-SQL 構文表記規則

構文

EVENTDATA( )

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

解説

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

EVENTDATA によって返されるデータは、以下のトランザクションの後で無効になります。

  • EVENTDATA を明示的に呼び出した
  • EVENTDATA を暗黙的に呼び出した
  • コミットした
  • ロールバックされた

注意事項

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

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

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

CREATE LOGIN または ALTER 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 スキーマ) Web ページにもイベント スキーマがあります。

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

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

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

Note

SQL Server Management Studio で [結果をグリッドに表示] を使用して <TSQLCommand> 要素をクエリすると、コマンド テキストに改行が表示されません。 代わりに、[結果をテキストで表示] を使用してください。

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  

Note

イベント データを返す場合は、query() メソッドの代わりに XQuery の value() を使います。 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 トリガー
イベント通知
ログオン トリガー