EVENTDATA 함수 사용Use the EVENTDATA Function

DDL 트리거를 발생하는 이벤트에 대한 정보는 EVENTDATA 함수를 사용하여 캡처합니다.Information about an event that fires a DDL trigger is captured by using the EVENTDATA function. 이 함수는 xml 값을 반환합니다.This function returns an xml value. XML 스키마에는 다음에 대한 정보가 포함됩니다.The XML schema includes information about the following:

  • 이벤트의 시간The time of the event.

  • 트리거 실행 시 연결의 SPID(시스템 프로세스 ID)The System Process ID (SPID) of the connection when the trigger executed.

  • 트리거를 실행한 이벤트의 유형The type of event that fired the trigger.

    이벤트 유형에 따라 스키마에는 이벤트가 발생한 데이터베이스, 이벤트가 발생한 개체 및 이벤트의 Transact-SQLTransact-SQL 문과 같은 추가 정보가 포함됩니다.Depending on the event type, the schema then includes additional information such as the database in which the event occurred, the object against which the event occurred, and the Transact-SQLTransact-SQL statement of the event. 자세한 내용은 DDL Triggers을(를) 참조하세요.For more information, see DDL Triggers.

    예를 들어 AdventureWorks2012AdventureWorks2012 예제 데이터베이스에서 다음 DDL 트리거가 생성된다고 가정해 보십시오.For example, the following DDL trigger is created in the AdventureWorks2012AdventureWorks2012 sample database:

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  
;  

그런 후에 다음 CREATE TABLE 문이 실행됩니다.The following CREATE TABLE statement is then run:

CREATE TABLE NewTable (Column1 int);

DDL 트리거의 EVENTDATA() 문은 허용되지 않는 CREATE TABLE 문의 텍스트를 캡처합니다.The EVENTDATA() statement in the DDL trigger captures the text of the CREATE TABLE statement that is not allowed. 이렇게 하려면 EVENTDATA로 생성된 xml 데이터에 대해 XQuery를 사용하여 <CommandText> 요소를 검색합니다.This is achieved by using an XQuery statement against the xml data that is generated by EVENTDATA and retrieving the <CommandText> element. 자세한 내용은 XQuery 언어 참조(SQL Server)를 참조하세요.For more information, see XQuery Language Reference (SQL Server).

주의

EVENTDATA는 CREATE_SCHEMA 이벤트의 데이터와 해당 CREATE SCHEMA 정의(있는 경우)의 를 캡처합니다.EVENTDATA captures the data of CREATE_SCHEMA events as well as the of the corresponding CREATE SCHEMA definition, if any exists. 또한 EVENTDATA는 정의를 별개의 이벤트로 인식합니다.Additionally, EVENTDATA recognizes the definition as a separate event. 따라서 CREATE SCHEMA 정의의 가 나타내는 이벤트와 CREATE_SCHEMA 이벤트 둘 다에서 생성된 DDL 트리거는 TSQLCommand 데이터 등의 동일한 이벤트 데이터를 두 번 반환할 수 있습니다.Therefore, a DDL trigger created on both a CREATE_SCHEMA event, and an event represented by the of the CREATE SCHEMA definition, may return the same event data twice, such as the TSQLCommand data. 예를 들어 CREATE_SCHEMA 및 CREATE_TABLE 이벤트 둘 다에서 생성된 DDL 트리거가 있으며 다음 일괄 처리가 실행된다고 가정해 보십시오.For example, consider a DDL trigger that is created on both the CREATE_SCHEMA and CREATE_TABLE events and the following batch is run:

CREATE SCHEMA s

CREATE TABLE t1 (col1 int)

응용 프로그램에서 CREATE_TABLE 이벤트의 TSQLCommand 데이터를 검색하면 이 데이터는 CREATE_SCHEMA 이벤트가 발생할 때와 CREATE_TABLE 이벤트가 발생할 때 각각 한 번씩, 두 번 표시될 수 있습니다.If the application retrieves the TSQLCommand data of the CREATE_TABLE event, be aware that this data may appear two times: once when the CREATE_SCHEMA event occurs, and again when the CREATE_TABLE event occurs. CREATE_SCHEMA 이벤트 및 해당하는 CREATE SCHEMA 정의의 텍스트 둘 다에서 DDL 트리거를 만드는 경우를 방지하거나 같은 이벤트가 두 번 처리되지 않도록 하는 논리를 응용 프로그램에 구축합니다.Avoid creating DDL triggers on both the CREATE_SCHEMA events and the texts of any corresponding CREATE SCHEMA definitions, or build logic into your application so that the same event is not processed twice.

ALTER TABLE 및 ALTER DATABASE 이벤트ALTER TABLE and ALTER DATABASE Events

ALTER_TABLE 및 ALTER_DATABASE 이벤트에 대한 이벤트 데이터에는 DDL 문의 영향을 받는 다른 개체의 이름 및 유형과 이러한 개체에서 수행되는 동작도 포함됩니다.The event data for the ALTER_TABLE and ALTER_DATABASE events also includes the names and types of other objects affected by the DDL statement and the action performed on these objects. ALTER_TABLE 이벤트 데이터에는 ALTER TABLE 문의 영향을 받는 열, 제약 조건 또는 트리거의 이름과 영향을 받는 개체에서 수행되는 동작(만들기, 변경, 삭제, 설정 또는 해제)이 포함됩니다.The ALTER_TABLE event data includes the names of the columns, constraints, or triggers affected by the ALTER TABLE statement and the action (create, alter, drop, enable, or disable) performed on the affected objects. ALTER DATABASE 이벤트 데이터에는 ALTER DATABASE 문의 영향을 받는 파일 또는 파일 그룹의 이름과 영향을 받는 개체에서 수행되는 동작(만들기, 변경, 또는 삭제)이 포함됩니다.The ALTER_DATABASE event data includes the names of any files or filegroups affected by the ALTER DATABASE statement and the action (create, alter, or drop) performed on the affected objects.

예를 들어 AdventureWorks 예제 데이터베이스에서 다음 DDL 트리거를 만듭니다.For example, create the following DDL trigger in the AdventureWorks sample database:

CREATE TRIGGER ColumnChanges  
ON DATABASE   
FOR ALTER_TABLE  
AS  
-- Detect whether a column was created/altered/dropped.  
SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)')  
RAISERROR ('Table schema cannot be modified in this database.', 16, 1);  
ROLLBACK;  

그런 다음 제약 조건을 위반하는 다음 ALTER TABLE 문을 실행합니다.Then execute the following ALTER TABLE statement that violates a constraint:

ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date;   

DDL 트리거의 EVENTDATA() 문은 허용되지 않는 ALTER TABLE 문의 텍스트를 캡처합니다.The EVENTDATA() statement in the DDL trigger captures the text of the ALTER TABLE statement that is not permitted.

예제Example

EVENTDATA 함수를 사용하여 이벤트 로그를 만들 수 있습니다.You can use the EVENTDATA function to create a log of events. 다음 예에서는 테이블을 만들어 이벤트 정보를 저장합니다.In the following example, a table is created to store event information. 그런 다음 데이터베이스 수준의 DDL 이벤트가 발생할 때마다 다음 정보로 테이블을 채우는 DDL 트리거가 현재 데이터베이스에 생성됩니다.A DDL trigger is then created on the current database that populates the table with the following information whenever any database-level DDL event occurs:

  • 이벤트의 시간(GETDATE 함수 사용)The time of the event (using the GETDATE function).

  • 해당 세션에 이벤트가 발생한 데이터베이스 사용자(CURRENT_USER 함수 사용)The database user against whose session the event occurred (using the CURRENT_USER function).

  • 이벤트 유형The type of the event.

  • 이벤트를 구성한 Transact-SQLTransact-SQLThe Transact-SQLTransact-SQL statement that comprised the event.

    그런 다음 EVENTDATA로 생성된 xml 데이터에 대해 XQuery를 사용하여 마지막 두 항목도 캡처합니다.Again, the last two items are captured by using XQuery against the xml data that is generated by EVENTDATA.

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  
참고

이벤트 데이터를 반환하려면 query() 메서드보다 XQuery의 value() 메서드를 사용하는 것이 좋습니다.To return event data, we recommend that you 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 (CRLF) instances in the output, while the value() method renders CRLF instances invisible in the output.

이와 유사한 DDL 트리거 예가 AdventureWorks2012AdventureWorks2012 예제 데이터베이스와 함께 제공됩니다.A similar DDL trigger example is provided with the AdventureWorks2012AdventureWorks2012 sample database. 이 예를 사용하려면 SQL Server Management StudioSQL Server Management Studio를 사용하여 데이터베이스 트리거 폴더를 찾으십시오.To obtain the example, locate the Database Triggers folder by using SQL Server Management StudioSQL Server Management Studio. 이 폴더는 데이터베이스의 프로그래밍 기능 AdventureWorks2012AdventureWorks2012 폴더 아래에 있습니다.This folder is located under the Programmability folder of the AdventureWorks2012AdventureWorks2012 database. ddlDatabseTriggerLog 를 마우스 오른쪽 단추로 클릭하고 데이터베이스 트리거 스크립팅을 선택합니다.Right-click ddlDatabseTriggerLog and select Script Database Trigger as. DDL 트리거 ddlDatabseTriggerLog 는 기본적으로 해제되어 있습니다.By default, DDL trigger ddlDatabseTriggerLog is disabled.

참고 항목See Also

DDL 이벤트 DDL Events
DDL 이벤트 그룹 DDL Event Groups