EVENTDATA (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance
この関数は、サーバーまたはデータベースのイベントに関する情報を返します。 イベント通知が発生し、指定されたサービス ブローカーが結果を受け取ると、EVENTDATA
が呼び出されます。 DDL またはログオン トリガーも、EVENTDATA
の内部使用をサポートしています。
構文
EVENTDATA( )
解説
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