2016. 5. 4. 15:00

MSSQL 저장 프로시저는 변경 이력 관리가 힘듭니다.

보통 테스트용 DB에서 테스트가 끝나면 실 DB로 옮기는 작업을 해야 하는데 버전 관리가 안 된다는 건 힘든 일이죠.

물론 툴이 있긴 합니다.

 

( 참고 : SQL Source Control, sourcegear - vault )

무료 툴이 있는지는 모르겠습니다 ㅡ.-;;;;;

 

그런데 르매님이 만드신 트리거가 있습니다.

(참고 : MS SQL/Sequel SAFE for MS-SQL - 르매의 SQL 이야기)

무료로 쓸 수 있고 편리성도 좋습니다 ㅎㅎㅎ

 

근데 각 잡고 쓸 때는 좋은데 가볍게 쓸 때는 손이 좀 갑니다.

마침 다른 분이 간단하게 쓸 때 사용하는 트리거를 공개하셨네요.

( 참고 : SQLER.com - SVN에서 소스를 관리 하듯이 저장 프로시저의 변경 이력을 관리 할 수 있는 Tool에는 어떤게 있을가요? )

 

 

* mssql 2005 이상에서 동작합니다. *

 

 

1. 로그용 테이블 생성

변경 이력이 쌓여있을 테이블입니다.

CREATE TABLE dbo.SPLOG(
	일련번호 int IDENTITY(1,1) NOT NULL,
	오브젝트명 varchar(100) NULL,
	구분 varchar(20) NULL,
	SQLCMD varchar(max) NULL,
	수정자 varchar(20) NULL,
	수정일 datetime NULL,
 CONSTRAINT XPKSPLOG PRIMARY KEY NONCLUSTERED 
(
	일련번호 ASC
))
GO

 

 

2. 트리거 생성

트리거를 생성해서 저장 프로시저가 변경되면 로그용 테이블에 쌓이게 해줍니다.

CREATE TRIGGER TRG_SPLOG ON DATABASE
FOR
CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE,
CREATE_VIEW, ALTER_VIEW, DROP_VIEW,
CREATE_FUNCTION, ALTER_FUNCTION, DROP_FUNCTION,
CREATE_TRIGGER, ALTER_TRIGGER, DROP_TRIGGER

AS

DECLARE @DATA XML

SET @DATA = EVENTDATA()

INSERT INTO DBO.SPLOG (오브젝트명, 구분, SQLCMD, 수정자, 수정일)
VALUES
(@DATA.value('(/EVENT_INSTANCE/ObjectName)[1]', 'VARCHAR(100)'),
 @DATA.value('(/EVENT_INSTANCE/EventType)[1]', 'VARCHAR(100)'),
 @DATA.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'VARCHAR(MAX)'),
 HOST_NAME(),
 GETDATE())

 

 

3. 테스트

테이블과 트리거가 아래와 같이 생성됩니다.

 

 

이제 저장 프로시저를 수정하고 로그 테이블을 확인해 봅시다.

수정한 내역이 보입니다.

수정한 내역이 보입니다.

SQL 명령어도 만들어 줍니다 ㅎㅎㅎ

 

 

마무리

MS에서 이 기능을 넣어주지 않는 이유를 모르겠습니다.

트리거라도 자동생성할 수 있게 옵션을 제공해도 될 듯 한데 말이죠..