다음을 통해 공유


EVENTDATA(Transact-SQL)

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance

이 함수는 서버 또는 데이터베이스 이벤트 정보를 반환합니다. 이벤트 알림이 실행되고 지정된 Service Broker가 결과를 수신하면 EVENTDATA가 호출됩니다. DDL 또는 로그온 트리거는 EVENTDATA의 내부 사용도 지원합니다.

Transact-SQL 구문 표기 규칙

구문

EVENTDATA( )

설명

EVENTDATA는 DDL 또는 로그온 트리거 내에 직접 참조되는 경우에만 데이터를 반환합니다. EVENTDATA는 DDL 또는 로그온 트리거가 해당 루틴을 호출하는 경우에도 다른 루틴이 이벤트를 호출하면 null을 반환합니다.

EVENTDATA에서 반환된 데이터는 다음 트랜잭션 이후에는 유효하지 않습니다.

  • EVENTDATA를 명시적으로 호출한 트랜잭션
  • EVENTDATA를 암시적으로 호출한 트랜잭션
  • 커밋된 트랜잭션
  • 롤백된 트랜잭션

주의

EVENTDATA는 각 문자에 2바이트를 사용하는 유니코드로 클라이언트에 전송되는 XML 데이터를 반환합니다. EVENTDATA는 이러한 유니코드 코드 포인트를 나타낼 수 있는 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.xsdd 디렉터리에 설치됩니다.

Microsoft SQL Server XML 스키마 웹 페이지에도 이벤트 스키마가 있습니다.

특정 이벤트에 대한 스키마를 추출하려면 복합 유형 EVENT_INSTANCE_<event_type>에 대한 스키마를 검색하세요. 예를 들어 DROP_TABLE 이벤트의 스키마를 추출하려면 EVENT_INSTANCE_DROP_TABLE의 스키마를 검색합니다.

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

이 예제에서는 새 데이터베이스 테이블 만들기를 차단하는 DDL 트리거를 만듭니다. EVENTDATA에서 생성한 XML 데이터에 XQuery를 사용하면 트리거를 실행하는 Transact-SQL 문이 캡처됩니다. 자세한 내용은 XQuery 언어 참조(SQL Server)를 참조하세요.

참고

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  

참고

이벤트 데이터를 반환하려면 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 트리거
이벤트 알림
LOGON 트리거