sub_title
 MSSQL
제   목 [MSSQL] DDL_Trigger_Example
작성자 수확물 등록일 2008-09-08 17:47:38 조회수 34,643
[MSSQL] DDL_Trigger_Example


--http://databaser.net
--참고: http://www.sqlservercentral.com/articles/SQLServerCentral.com/sqlserver2005logontriggers/2366/
USE AdeventureWorks
GO

--서비스 브로커 활성화
ALTER DATABASE AdeventureWorks SET ENABLE_BROKER
GO

--DDL트리거에 의해 데이터가 담길 테이블
CREATE TABLE dbo.T_DDLLog
(
LoggingID int IDENTITY(1,1)
, EventTime DATETIME
, EventType NVARCHAR(255)
, LoginName NVARCHAR(255)
, HostName NVARCHAR(255)
, NTUserName NVARCHAR(255)
, NTDomainName NVARCHAR(255)
, Success INT
, FullLog XML
)
GO

--Try~Catch
CREATE TABLE dbo.T_SP_ErrorLog(
ErrorNumber int NULL
, ErrorSeverity int NULL
, ErrorState int NULL
, ErrorProcedure nvarchar(126) NULL
, ErrorLine int NULL
, ErrorMessage nvarchar(2048) NULL
, ErrorDatetime datetime NULL
, Parameters nvarchar(max) NULL
)

CREATE CLUSTERED INDEX CIX_EventTime
ON dbo.T_DDLLog(EventTime DESC);

CREATE INDEX NIX_LoggingID
ON dbo.T_DDLLog(LoggingID);
GO

--서비스를 위한 설정들(큐, 서비스)
--DROP QUEUE LoggingQueue
CREATE QUEUE LoggingQueue
GO

--DROP SERVICE LoggingService
CREATE SERVICE LoggingService
ON QUEUE LoggingQueue
([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification])
GO

--이벤트 노티 생성
--DROP EVENT NOTIFICATION Logging_Event_Notification ON SERVER
--ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.ko/wmi9/html/e2916cd7-a3ed-41e6-97b4-2ee060754cbe.htm
CREATE EVENT NOTIFICATION Logging_Event_Notification
ON SERVER
FOR DDL_EVENTS
--, TRC_CLR
--, TRC_DEPRECATION
--, TRC_ERRORS_AND_WARNINGS
--, TRC_FULL_TEXT
--, TRC_LOCKS
--, TRC_OBJECTS
--, TRC_OLEDB
--, TRC_PERFORMANCE
--, TRC_QUERY_NOTIFICATIONS
--, TRC_SECURITY_AUDIT
--, AUDIT_LOGIN
--, AUDIT_LOGOUT
--, AUDIT_LOGIN_FAILED
--, AUDIT_LOGIN_CHANGE_PASSWORD_EVENT
--, TRC_SERVER
--, TRC_STORED_PROCEDURES
--, TRC_TSQL
--, TRC_USER_CONFIGURABLE
TO SERVICE 'LoggingService', 'current database'
GO

--서비스 브로커의 큐에서 활성화될 프로시저
CREATE PROCEDURE Up_DDL_Log_Create
AS
SET XACT_ABORT ON
SET NOCOUNT ON

DECLARE @message_body XML,
@message_type_name NVARCHAR(256),
@dialog UNIQUEIDENTIFIER ;

--Endless loop
WHILE (1 = 1)
BEGIN
BEGIN TRANSACTION ;

-- Receive the next available message
WAITFOR
(
RECEIVE TOP(1)
@message_type_name=message_type_name
, @message_body=message_body
, @dialog = conversation_handle
FROM LoggingQueue
), TIMEOUT 2000

--Rollback and exit if no messages were found
IF (@@ROWCOUNT = 0)
BEGIN
ROLLBACK TRANSACTION ;
BREAK ;
END;

--End conversation of end dialog message
IF (@message_type_name = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog')
BEGIN
PRINT 'End Dialog received for dialog # ' + cast(@dialog AS nvarchar(40)) ;
END CONVERSATION @dialog ;
END ELSE IF (@message_type_name = 'http://schemas.microsoft.com/SQL/ServiceBroker/Error')
BEGIN
PRINT 'End Dialog received for dialog # ' + cast(@dialog AS nvarchar(40)) ;
END CONVERSATION @dialog ;
END;
ELSE
BEGIN
BEGIN TRY
INSERT INTO dbo.T_DDLLog
(
EventTime
, EventType
, LoginName
, HostName
, NTUserName
, NTDomainName
, Success
, FullLog
)
SELECT
CAST(CAST(@message_body.query('/EVENT_INSTANCE/PostTime/text()') AS VARCHAR(64)) AS DATETIME)
, CAST(@message_body.query('/EVENT_INSTANCE/EventType/text()') AS VARCHAR(100))
, CAST(@message_body.query('/EVENT_INSTANCE/LoginName/text()') AS VARCHAR(100))
, CAST(@message_body.query('/EVENT_INSTANCE/HostName/text()') AS VARCHAR(100))
, CAST(@message_body.query('/EVENT_INSTANCE/NTUserName/text()') AS VARCHAR(100))
, CAST(@message_body.query('/EVENT_INSTANCE/NTDomainName/text()') AS VARCHAR(100))
, CAST(CAST(@message_body.query('/EVENT_INSTANCE/Success/text()') AS VARCHAR(64)) AS INTEGER)
, @message_body
END TRY

BEGIN CATCH
IF (XACT_STATE()) = -1 ROLLBACK;
ELSE IF (XACT_STATE()) = 1 COMMIT;

INSERT dbo.T_SP_ErrorLog
(
ErrorNumber
, ErrorSeverity
, ErrorState
, ErrorProcedure
, ErrorLine
, ErrorMessage
, ErrorDatetime
, Parameters
)
SELECT
ERROR_NUMBER()
, ERROR_SEVERITY()
, ERROR_STATE()
, ERROR_PROCEDURE()
, ERROR_LINE()
, ERROR_MESSAGE()
, GETDATE()
, CAST(@message_body AS nvarchar(max)); -- nvarchar(max) (파라미터를 넣는다.)

RETURN ERROR_NUMBER();
END CATCH;
END;
COMMIT TRANSACTION
END
GO

--큐 변경
--DROP QUEUE LoggingQueue
ALTER QUEUE LoggingQueue
WITH ACTIVATION (
STATUS = ON,
PROCEDURE_NAME = dbo.Up_DDL_Log_Create ,
MAX_QUEUE_READERS = 2, EXECUTE AS SELF ), STATUS = ON
GO

--ALTER QUEUE dbo.LoggingQueue WITH STATUS = ON
--ALTER QUEUE dbo.LoggingQueue WITH STATUS = OFF

/*
--Test
drop table test
CREATE TABLE test(id int)
GO

SELECT
EventTime
, FullLog.value('(/EVENT_INSTANCE/LoginName)[1]','nvarchar(255)') LoginName
, FullLog.value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(255)') EventType
, FullLog.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') CommandText
FROM dbo.T_DDLLog
WHERE LoggingID = 2
*/

CREATE PROC dbo.Up_DDL_Log_Read
@BeginDT datetime
, @EndDT datetime
, @LoggingID int = 0
, @EventType nvarchar(255) = ''
, @LoginName nvarchar(255) = ''
, @HostName nvarchar(255) = ''
, @NTUserName nvarchar(255) = ''
, @NTDomainName nvarchar(1000) = ''
, @SQLViewYN bit = 0
AS
SELECT
LoggingID
, EventTime
, EventType
, LoginName
, HostName
, NTUserName
, NTDomainName
, Success
, FullLog
--, CASE WHEN @SQLViewYN = 0 THEN '' ELSE FullLog.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)') END SQLSource
FROM dbo.T_DDLLog
WHERE 1=1
AND EventTime BETWEEN @BeginDT AND @EndDT
GO

/*

SELECT * FROM dbo.T_DDLLog
where EventType like '%LOGIN%'

select top 100 * from LoggingQueue


truncate table T_DDLLog
SELECT top 100 * FROM LoggingQueue
*/

 
0
    
 
0
        list
 
※ 짧은 댓글일수록 예의를 갖추어 작성해 주시기 바랍니다.
line
reply cancel
 
번호 제목 글쓴이 추천 조회 날짜
34  인덱스를 위한 교재 추천 부탁 드립니다.   member 난모르겠 0 / 0 23396 2020-06-28
33  테이블 부하에 대해서...?   member 헨씀히포 0 / 0 23218 2019-05-24
32  MSSQL - 문자함수(len함수와 datalength 함수) 이미지   admin 웹마당넷 3 / 0 41073 2017-09-10
31  MSSQL - 백업 데이터를 다른 데이터베이스로 복원하기 이미지   admin 웹마당넷 6 / 2 29849 2015-07-05
30  MSSQL - SELECT 결과를 테이블로 만들기 이미지   admin 웹마당넷 1 / 0 27702 2015-06-26
29  기본 데이타 베이스 저장소 위치 바꾸기   member 아침마당 1 / 1 26428 2010-11-04
28  SQL Server 2008 복원시 트랜잭션 로그 백업   member 아침마당 1 / 0 26530 2010-09-25
27  SQL 인젝션 공격을 당했을 경우 인젝션 스크립트 지우는 저장 프로시저   member 아침마당 1 / 0 26073 2010-09-14
26  SQL Server 트랜잭션 로그 파일 줄이는 방법   member 아침마당 0 / 1 32444 2010-09-14
25  [MSSQL] SQL Server 2008 테이블 디자인 수정시 주의 사항   member 아침마당 1 / 0 28220 2010-08-22
24  [MSSQL] ISNULL 함수 간단 예제   member 아침마당 4 / 1 47993 2010-08-05
23  MSSQL - SELECT 와 동시에 INSERT 하기   admin 웹마당넷 14 / 3 153914 2009-02-03
22  MSSQL - IDENTITY 값 초기화 하기   admin 웹마당넷 3 / 2 63414 2009-01-27
21  MS-SQL 클러스터드 인덱스를 어떤 컬럼(들)에 생성하는 것이 유리할까?   member 마카로니 0 / 0 30010 2009-01-08
20  테이블 및 개체의 정보를 확인하기 위한 시스템 저장 프로시저(System Stored pr..   admin 웹마당넷 0 / 0 27625 2008-12-20
19  MSSQL 조인(JOIN)을 이용한 UPDATE 및 DELETE   admin 웹마당넷 5 / 0 53894 2008-11-29
18  SQL injection 웹에서 체크하기   member 수확물 0 / 0 26855 2008-10-10
17  MSSQL - CASE WHEN문   member 다자래 1 / 0 69963 2008-09-19
16  [MSSQL] 파티션 정보 검색   member 수확물 0 / 0 28699 2008-09-08
15  [MSSQL] DDL_Trigger_Example   member 수확물 0 / 0 34643 2008-09-08
14  [MSSQL] xml을 이용한 split   member 수확물 1 / 0 28819 2008-08-26
13  MSSQL - UNION ALL을 이용했을때 테이블명 가져오기 이미지   member 다자래 0 / 0 40219 2008-08-21
12  MSSQL - NULL 값을 다른 값으로 대체하기   member 다자래 8 / 4 101391 2008-08-21
11  [MSSQL] View안에 저장프로스져를 쓰는 방법   member 수확물 0 / 0 45378 2008-08-08
10  MSSQL - 숫자 세자리 마다 콤마(쉼표) 찍기   member 다자래 5 / 0 59233 2008-08-07
write
[2] button