EVENTDATA(Transact-SQL)

업데이트: 2006년 12월 12일

서버 또는 데이터베이스 이벤트에 대한 정보를 반환합니다. EVENTDATA는 이벤트 알림이 발생할 때 호출되며 결과는 지정된 Service Broker에 반환됩니다. 또한 EVENTDATA는 DDL 또는 LOGON 트리거 본문 내에서 사용할 수 있습니다.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

EVENTDATA( )

주의

EVENTDATA는 DDL 또는 LOGON 트리거 내에 직접 참조되는 경우에만 데이터를 반환합니다. 다른 루틴에서 EVENTDATA를 호출한 경우 해당 루틴을 트리거가 호출한 것이라 해도 EVENTDATA는 Null을 반환합니다.

EVENTDATA가 반환한 데이터는 EVENTDATA를 호출한 트랜잭션이 암시적으로나 명시적으로 커밋되거나 롤백된 이후에는 유효하지 않습니다.

ms173781.Caution(ko-kr,SQL.90).gif주의:
EVENTDATA는 XML 데이터를 반환합니다. 이 데이터는 각 문자에 대해 2바이트를 사용하는 유니코드로 클라이언트에 전송됩니다. 다음 유니코드 코드 포인트는 EVENTDATA가 반환한 XML로 표시할 수 있습니다. 0x0009 0x000A 0x000D >= 0x0020 && <= 0xD7FF >= 0xE000 && <= 0xFFFD Transact-SQL 식별자에 표시되는 일부 문자와 데이터는 XML로 표현되거나 허용되지 않습니다. 이전 목록에 표시되지 않은 코드 포인트가 있는 문자 또는 데이터는 물음표(?)로 매핑됩니다.

반환된 스키마

EVENTDATA는 xml 유형의 값을 반환합니다. 각 이벤트에 대해 반환되는 스키마는 <EVENT_INSTANCE> 요소 내에 중첩된 요소로 구성됩니다. 이벤트에 대해 반환되는 스키마를 보려면 SQL Server 온라인 설명서에서 색인 또는 검색을 사용하여 해당 이벤트 항목을 찾으십시오. 이벤트에 대해 나열된 속성 이름은 스키마에서 반환된 요소에 해당합니다. 단, 다음의 경우는 예외입니다.

  • 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>

1. DDL 트리거에서 이벤트 데이터 쿼리

다음 예에서는 DDL 트리거를 만들어 데이터베이스에 새 테이블이 생성되는 것을 방지합니다. 트리거를 실행하는 Transact-SQL 문은 EVENTDATA가 생성한 XML 데이터에 대해 XQuery를 사용하여 캡처합니다. 자세한 내용은 xml 데이터 형식에 대한 XQuery를 참조하십시오.

[!참고] 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

[!참고] 이벤트 데이터를 반환하려면 query() 메서드보다 XQuery의 value() 메서드를 사용하는 것이 좋습니다. query() 메서드는 XML 및 출력에서 앰퍼샌드로 이스케이프된 CR/LF(캐리지 리턴 및 줄 바꿈) 인스턴스를 반환하지만 value() 메서드는 출력에서는 볼 수 없는 CR/LF 인스턴스를 표시합니다.

2. 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는 LOGON 트리거 본문 내에서도 사용할 수 있다는 정보를 추가했습니다. LOGON 트리거는 SQL Server 서비스 팩 2에서 도입되었습니다.