2011-09-06 4 views
0

데이터베이스에 큰 테이블이 있고 개별 레코드의 변경 내용을 추적하려고합니다. 좀 더 정확하게 말하자면 날짜와 컬럼에 대한 변경 사항을 기록하고 싶습니다.트리거를 사용하여 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 삭제 된/삽입 된 테이블의 각 행에 대해이를 수행해야합니다.

+0

COLUMNS_UPDATED()를 보았습니까? – HABO

답변

1

Change Data Capture은 테이블 DML 변경 사항을 로그하는 솔루션이 될 수 있습니다.

0

흠 - 변경된 필드 만 기록하려면 각 필드를 개별적으로 확인해야합니다. 그러나 알 수 있듯이 다른 데이터 유형에서는 비교가 동일하게 작동하지 않습니다. 따라서 각 필드의 데이터 유형을 확인하고 적절하게 비교해야 할 것입니다. 나는 INFORMATION_SCHEMA에서 'DATA_TYPE'라는 필드가 믿는, 그래서 당신은 당신의 메타 테이블 삽입을 수행 할 때, 추가 열 추가

 

INSERT @meta_table 
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, 
    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  
     SELECT @col = COLUMN_NAME, @dataType = DATA_TYPE 
     FROM @meta_table WHERE idx = @i) 

     -- do something with @col 

     SET @i = @i + 1  
    END 
 

그리고 당신은 .. 당신이 테이블에있는 모든 다른 데이터 유형에 대한 등등

 

IF(@dataType = 'varchar') 
BEGIN 

-- do your comparison and insert here 

END 
ELSE IF(@dataType = 'int') 
BEGIN 

-- do you comparison and insert here 

END 
.... 


 

...와 ... 당신이 비교를하기 전에 데이터 유형을 확인 상단이

+0

흠 - 그래서 여러 행에 대해서도이 작업을하고 싶습니다. 업데이트 문이 여러 행을 수정 한 경우 - 수정 된 모든 행을 커서로 선택하고 각 행을 확인해야합니다. –

2

테이블 열을 반복 할 필요가 없습니다. 트리거는 특정 테이블에 대한 것이기 때문에, 이미 가지고있는 컬럼을 알 수 있습니다! 관심있는 열로 트리거를 작성하기 만하면됩니다. 반복적이고 지루하며 오류가 발생하기 쉬운 작업 일 수 있다고 말하면됩니까? 그러한 경우에는 좋은 프로그래머가 작업을 자동화합니다. 트리거를 자동으로 생성하고 즉시 리팩토링하고 스키마 변경 사항과 동기화되도록 코드 생성에 의존합니다. 런타임 스키마 검색을 배포하는 것은 방법이 아닙니다.

+0

열은 내 통제하에 있지 않으며 언제든지 추가/제거 할 수 있으므로 런타임에 열을 가져와야합니다. – Darcara