특정한 테이블의 이력을 따로 테이블로 남기려면 아래와 같은 방법으로 사용이 가능 할 것 같다.
물론 여기 적힌 방법 말고도 여러가지 방법이 존재한다.
아래 트리거를 사용한 방법으로 로그 조회 시 특정 시간대를 기준으로 조회하는 방법은 아래와 같다.
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