EVENTDATA (Transact-SQL)EVENTDATA (Transact-SQL)

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

この関数は、サーバーまたはデータベースのイベントに関する情報を返します。This function returns information about server or database events. イベント通知が発生し、指定されたサービス ブローカーが結果を受け取ると、EVENTDATA が呼び出されます。When an event notification fires, and the specified service broker receives the results, EVENTDATA is called. DDL またはログオン トリガーも、EVENTDATA の内部使用をサポートしています。A DDL or logon trigger also support internal use of EVENTDATA.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

  
EVENTDATA( )  

RemarksRemarks

EVENTDATA は、DDL トリガーまたはログオン トリガーの内部で直接参照された場合のみ、データを返します。EVENTDATA returns data only when referenced directly inside of a DDL or logon trigger. 他のルーチンから呼び出された場合は、たとえ DDL トリガーまたはログオン トリガーがそのルーチンを呼びだした場合であっても、EVENTDATA は null を返します。EVENTDATA returns null if other routines call it, even if a DDL or logon trigger calls those routines.

EVENTDATA によって返されるデータは、以下のトランザクションの後で無効になります。Data returned by EVENTDATA is invalid after a transaction that

  • EVENTDATA を明示的に呼び出したcalled EVENTDATA explicitly
  • EVENTDATA を暗黙的に呼び出したcalled EVENTDATA implicitly
  • コミットしたcommits
  • ロールバックされたis rolled back

注意事項

EVENTDATA が返す XML データは、1 文字に 2 バイトを使用する Unicode としてクライアントに送信されます。EVENTDATA returns XML data, sent to the client as Unicode that uses 2 bytes for each character. EVENTDATA は、次の Unicode コード ポイントを表す XML を返します。EVENTDATA returns XML that can represent these Unicode code points:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

XML は、Transact-SQLTransact-SQL の識別子およびデータで使用できる一部の文字を表現できず、したがって許可しません。XML cannot express, and will not permit, some characters that can appear in Transact-SQLTransact-SQL identifiers and data. 上記の一覧に含まれていないコード ポイントを含んでいる文字やデータは、疑問符 (?) にマップされます。Characters or data that have code points not shown in the previous list are mapped to a question mark (?).

CREATE LOGIN または ALTER LOGIN ステートメントを実行したとき、パスワードは表示されません。Passwords do not display when CREATE LOGIN or ALTER LOGIN statements execute. こにより、ログイン セキュリティが保護されます。This protects login security.

返されるスキーマSchemas Returned

EVENTDATA は、xml データ型の値を返します。EVENTDATA returns a value of data type xml. 既定では、すべてのイベントのスキーマ定義は、次のディレクトリにインストールされます:C:\Program Files\Microsoft SQL Server\nnnC:\Program Files\Microsoft SQL Server\nnn\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd。By default, the schema definition for all events installs in this directory: C:\Program Files\Microsoft SQL Server\nnnC:\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 ページにもイベント スキーマがあります。The Microsoft SQL Server XML Schemas web page also has the event schema.

特定のイベントのスキーマを抽出するには、複合型 EVENT_INSTANCE_<event_type> のスキーマを検索します。To extract the schema for any particular event, search the schema for the Complex Type EVENT_INSTANCE_<event_type>. たとえば、DROP_TABLE イベントのスキーマを抽出するには、EVENT_INSTANCE_DROP_TABLE のスキーマを検索します。For example, to extract the schema for the DROP_TABLE event, search the schema for EVENT_INSTANCE_DROP_TABLE.

使用例Examples

A.A. DDL トリガーでイベント データをクエリするQuerying event data in a DDL trigger

この例では、新しいデータベース テーブルが作成されないようにする DDL トリガーを作成します。This example creates a DDL trigger that prevents creation of new database tables. EVENTDATA によって生成された XML データに対して XQuery を使用して、トリガーを発生させる Transact-SQLTransact-SQL ステートメントをキャプチャします。Use of XQuery against the XML data generated by EVENTDATA captures the Transact-SQLTransact-SQL statement that fires the trigger. 詳しくは、「XQuery 言語リファレンス (SQL Server)」をご覧ください。See XQuery Language Reference (SQL Server) for more information.

注意

SQL Server Management StudioSQL Server Management Studio[結果をグリッドに表示] を使用して <TSQLCommand> 要素をクエリすると、コマンド テキストに改行が表示されません。When using Results to Grid in SQL Server Management StudioSQL Server Management Studio to query the <TSQLCommand> element, line breaks in the command text do not appear. 代わりに、 [結果をテキストで表示] を使用してください。Use Results to Text instead.

USE AdventureWorks2012;  
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() を使います。To return event data, use the XQuery value() method instead of the query() method. query() メソッドでは、XML およびアンパサンドでエスケープされる復帰と改行 (CR/LF) インスタンスが出力に返されます。一方 value() メソッドでは、CR/LF インスタンスが出力に返されますが、表示はされません。The query() method returns XML and ampersand-escaped carriage return and line feed (CR/LF) instances in the output, while the value() method renders CR/LF instances invisible in the output.

B.B. DDL トリガーでイベント データを含んだログ テーブルを作成するCreating a log table with event data in a DDL trigger

この例では、データベース レベルのすべてのイベントに関する情報ストレージのテーブルを作成し、DDL トリガーでそのテーブルにデータを設定します。This example creates a table for information storage about all database level events, and populates that table with a DDL trigger. EVENTDATA によって生成された XML データに対して XQuery を使用して、イベントの種類と Transact-SQLTransact-SQL ステートメントをキャプチャします。Use of XQuery against the XML data generated by EVENTDATA captures the event type and the Transact-SQLTransact-SQL statement.

USE AdventureWorks2012;  
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  

参照See Also

EVENTDATA 関数の使用 Use the EVENTDATA Function
DDL トリガー DDL Triggers
イベント通知 Event Notifications
ログオン トリガーLogon Triggers