데이터베이스에 큰 테이블이 있고 개별 레코드의 변경 내용을 추적하려고합니다. 좀 더 정확하게 말하자면 날짜와 컬럼에 대한 변경 사항을 기록하고 싶습니다.트리거를 사용하여 SQL Server 2008의 업데이트 된 열 저장
테이블에 25 개 이상의 구성 요소가 있으므로 개별적으로 테스트하지 않으려 고합니다. 내 AFTER UPDATE
트리거에서 ID-Date-Table-Column-OldValue-NewValue
내가 다른 값을 가질 열을 확인하고 내 테이블로를 기록하고 싶습니다처럼
로깅 테이블 보인다.
DECLARE @meta_table TABLE (
idx smallint Primary Key IDENTITY(1,1)
, TABLE_NAME nchar(100), COLUMN_NAME nchar(100), COLUMN_ID int
)
INSERT @meta_table
SELECT TABLE_NAME, COLUMN_NAME,
COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME),
COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM MYDATABASE.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTable';
내가 가진 열을 반복 할 수있다 :
가 내가있는 테이블의 열을 얻을 수있어 내가 모든 열을 확인하고 싶은 첫 번째 단계에서
SET @i = 1
SET @numrows = (SELECT COUNT(*) FROM @meta_table)
IF @numrows > 0
WHILE (@i <= (SELECT MAX(idx) FROM @meta_table))
BEGIN
SET @col = (SELECT COLUMN_NAME FROM @meta_table WHERE idx = @i)
-- do something with @col
SET @i = @i + 1
END
하지만, 이런 식으로 작동하지 않는다.
IF (SELECT @col FROM inserted) <> (SELECT @col FROM deleted)
BEGIN
-- INSERT into logging table ...
END
또한 업데이트의 첫 번째 행만 검사하므로 woul d 삭제 된/삽입 된 테이블의 각 행에 대해이를 수행해야합니다.
COLUMNS_UPDATED()를 보았습니까? – HABO