테이블 생성

 

CREATE TABLE [dbo].[DDLLog](

       [DDLLogIDX] [int] IDENTITY(1,1) NOT NULL,

       [PostTime] [datetime] NULL,

       [DB_User] [nvarchar](100) NULL,

       [Event] [nvarchar](100) NULL,

       [ObjectName] [nvarchar](100) NULL,

       [ObjectType] [nvarchar](100) NULL,

       [TSQL] [nvarchar](2000) NULL,

       [SPID] [int] NULL,

       [ServerName] [nvarchar](200) NULL,

       [LoginName] [nvarchar](100) NULL,

       [UserName] [nvarchar](100) NULL,

       [HostName] [nvarchar](100) NULL,

       [Program] [nvarchar](100) NULL,

       [DatabaseName] [nvarchar](200) NULL,

       [XMLData] [xml] NULL

) ON [PRIMARY]

 

GO

 

 

트리거 생성

 

CREATE TRIGGER [TRI_DDLLog]

ON DATABASE

FOR DDL_DATABASE_LEVEL_EVENTS

AS

 

DECLARE @data XML

SET @data = EVENTDATA()

DECLARE @SPID INT

SET @SPID = @data.value('(/EVENT_INSTANCE/SPID)[1]','int')

 

INSERT dbo.DDLLog

(

       PostTime

,      DB_User

,      Event

,      ObjectName

,      ObjectType

,      TSQL

,      SPID

,      ServerName

,      LoginName

,      UserName

,      HostName

,      Program

,      DatabaseName

,      XMLData

)

SELECT

       PostTime            = GETDATE()

,      DB_User                    = CONVERT(nvarchar(100), CURRENT_USER)

,      Event               = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)')

,      ObjectName          = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(100)')

,      ObjectType          = @data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'nvarchar(100)')

,      TSQL                = @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)')

,      SPID                = @data.value('(/EVENT_INSTANCE/SPID)[1]','int')

,      ServerName          = @data.value('(/EVENT_INSTANCE/ServerName)[1]','nvarchar(200)')

,      LoginName           = @data.value('(/EVENT_INSTANCE/LoginName)[1]','nvarchar(100)')

,      UserName            = @data.value('(/EVENT_INSTANCE/UserName)[1]','nvarchar(100)')

,      HostName            = (SELECT hostname FROM sys.sysprocesses WHERE spid = @SPID)

,      Program                    = (SELECT program_name FROM sys.sysprocesses WHERE spid =@SPID)

,      DatabaseName = @data.value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(200)')

,      XMLData                    = @data

 

 

GO

 

원하시는 DB에 트리거를 생성 후 DDL 문을 실행하면 해당 내역을 DB로 남기는 것 입니다.

 

아래는 테스트 스크립트 입니다.

 

--//1

CREATE TABLE TB1

(

       COL1   INT    NOT NULL

)

GO

 

--//2

ALTER TABLE TB1 ADD COL2 INT

GO

 

--//3

DROP TABLE TB1

GO

 

--//4

SELECT * FROM DDLLog

GO

ALTER

 

아래와 같은 결과를 보실 수 있으며 XMLData 컬럼을 클릭하시면 XML로 된 DDL 내역을 보실 수 있습니다.

 DDL1.png


http://www.sqler.com/427945

+ Recent posts