EVENTDATA(Transact-SQL)
서버 또는 데이터베이스 이벤트에 대한 정보를 반환합니다. EVENTDATA는 이벤트 알림이 발생할 때 호출되며 결과는 지정된 Service Broker에 반환됩니다. 또한 EVENTDATA는 DDL 또는 LOGON 트리거 본문 내에서 사용할 수 있습니다.
구문
EVENTDATA( )
주의
EVENTDATA는 DDL 또는 LOGON 트리거 내에 직접 참조되는 경우에만 데이터를 반환합니다. 다른 루틴에서 EVENTDATA를 호출한 경우 해당 루틴을 DDL 또는 로그온 트리거가 호출한 것이라 해도 EVENTDATA는 Null을 반환합니다.
EVENTDATA가 반환한 데이터는 EVENTDATA를 호출한 트랜잭션이 암시적으로나 명시적으로 커밋되거나 롤백된 이후에는 유효하지 않습니다.
주의 |
---|
EVENTDATA는 XML 데이터를 반환합니다. 이 데이터는 각 문자에 대해 2바이트를 사용하는 유니코드로 클라이언트에 전송됩니다. 다음 유니코드 코드 포인트는 EVENTDATA가 반환한 XML로 표시할 수 있습니다. 0x0009 0x000A 0x000D >= 0x0020 && <= 0xD7FF >= 0xE000 && <= 0xFFFD Transact-SQL 식별자에 표시되는 일부 문자와 데이터는 XML로 표현되거나 허용되지 않습니다. 이전 목록에 표시되지 않은 코드 포인트가 있는 문자 또는 데이터는 물음표(?)로 매핑됩니다. |
반환된 스키마
EVENTDATA는 xml 유형의 값을 반환합니다. 기본적으로 모든 이벤트에 대한 스키마 정의는 C:\Program Files\Microsoft SQL Server\100\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd 디렉터리에 설치됩니다.
또는 이벤트 스키마는 Microsoft SQL Server XML Schemas 웹 페이지에 게시됩니다.
특정 이벤트에 대한 스키마를 추출하려면 복합 유형 EVENT_INSTANCE_<event_type>에 대한 스키마를 검색하십시오. 예를 들어 DROP_TABLE 이벤트에 대한 스키마를 추출하려면 EVENT_INSTANCE_DROP_TABLE에 대한 스키마를 검색하십시오.
예
1. DDL 트리거에서 이벤트 데이터 쿼리
다음 예에서는 DDL 트리거를 만들어 데이터베이스에 새 테이블이 생성되는 것을 방지합니다. 트리거를 실행하는 Transact-SQL 문은 EVENTDATA가 생성한 XML 데이터에 대해 XQuery를 사용하여 캡처합니다. 자세한 내용은 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
3. 스키마 일부에 대해 이벤트 인스턴스의 유효성 검사
다음 예제에서는 EVENTDATA가 반환한 스키마에 대해 DROP_TABLE 이벤트의 유효성을 검사합니다.
IF EXISTS (SELECT * FROM sys.xml_schema_collections WHERE name='EventsXML')
DROP XML SCHEMA COLLECTION EventsXML ;
GO
DECLARE @x xml
SET @x = (SELECT * FROM OPENROWSET(BULK 'c:\Program Files\Microsoft SQL Server\90\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd', single_clob) AS x)
CREATE XML SCHEMA COLLECTION EventsXML AS @x ;
GO
DECLARE @x xml(XSDEVENTS)
DECLARE @y xml
DECLARE @n nvarchar(max)
SELECT @y = EVENTDATA()
SELECT @n = @y
SELECT @n = REPLACE(@n, '<EVENT_INSTANCE', '<EVENT_INSTANCE xmlns=''https://schemas.microsoft.com/sqlserver/2006/eventdata'' xmlns:xsi=''http://www.w3.org/2001/XMLSchema-instance'' xsi:type=''EVENT_INSTANCE_DROP_TABLE''')
SELECT @x = @n -- This causes the validation.