특정한 테이블의 이력을 따로 테이블로 남기려면 아래와 같은 방법으로 사용이 가능 할 것 같다. 

물론 여기 적힌 방법 말고도 여러가지 방법이 존재한다.


아래 트리거를 사용한 방법으로 로그 조회 시 특정 시간대를 기준으로 조회하는 방법은 아래와 같다.

2017/11/20 - [프로그램 자료/MS-SQL] - 로그 테이블 저장 및 조회(특정 시점에 데이터 보기)



소스를 보자.

-- 데이터 테이블

IF OBJECT_ID('TRG_TEST', 'U') IS NOT NULL

        DROP TABLE TRG_TEST

CREATE TABLE TRG_TEST

(

        ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY

        , DATA NVARCHAR(200)

        , REG_DT DATETIME NOT NULL DEFAULT GETDATE()

)

GO

 

-- 데이터 로그 테이블

IF OBJECT_ID('TRG_TEST_HIS', 'U') IS NOT NULL

        DROP TABLE TRG_TEST_HIS

CREATE TABLE TRG_TEST_HIS

(

        ID INT NOT NULL

        , DATA NVARCHAR(200)

        , REG_DT DATETIME NOT NULL DEFAULT GETDATE()

        , START_DT DATETIME NOT NULL DEFAULT GETDATE()

        , END_DT DATETIME

        , STATUS CHAR(1) NOT NULL

        , USERID nvarchar(100)

        , CONSTRAINT PK_TRG_TEST_HIS PRIMARY KEY CLUSTERED (ID, START_DT) 

)

GO

 

 

-- INSERT 트리거

CREATE TRIGGER TRG_INSERT

ON TRG_TEST

AFTER INSERT

AS

        INSERT INTO TRG_TEST_HIS (ID, DATA, REG_DT, START_DT, END_DT, STATUS, USERID)

        SELECT ID, DATA, REG_DT, GETDATE(), NULL, 'I', ORIGINAL_LOGIN()

        FROM inserted

GO

 

-- DELETE 트리거

CREATE TRIGGER TRG_DELETE

ON TRG_TEST

AFTER DELETE

AS

        UPDATE A SET END_DT = GETDATE()

        FROM TRG_TEST_HIS AS A

               JOIN deleted AS D ON A.ID = D.ID AND A.END_DT IS NULL

 

        INSERT INTO TRG_TEST_HIS (ID, DATA, REG_DT, START_DT, END_DT, STATUS, USERID)

        SELECT ID, DATA, REG_DT, GETDATE(), NULL, 'D', ORIGINAL_LOGIN()

        FROM deleted

GO

 

---- UPDATE 트리거

CREATE TRIGGER TRG_UPDATE

ON TRG_TEST

AFTER UPDATE

AS

        UPDATE A SET END_DT = GETDATE()

        FROM TRG_TEST_HIS AS A

               JOIN deleted AS D ON A.ID = D.ID AND A.END_DT IS NULL

 

        INSERT INTO TRG_TEST_HIS (ID, DATA, REG_DT, START_DT, END_DT, STATUS, USERID)

        SELECT ID, DATA, REG_DT, GETDATE(), NULL, 'U', ORIGINAL_LOGIN()

        FROM inserted

GO

 

 

-- 테스트

 

INSERT INTO TRG_TEST (DATA) VALUES('DATAS')

INSERT INTO TRG_TEST (DATA) VALUES('DATAS')

 

UPDATE TRG_TEST SET DATA = 'DA787DADA' WHERE ID = 1

 

--DELETE FROM TRG_TEST WHERE ID = 1

 

SELECT * FROM TRG_TEST

 

SELECT * FROM TRG_TEST_HIS

 

 




Posted by motolies
,