2011-08-22 5 views
0

최근에 데이터베이스 테이블에서 감사를 작성하여 모든 변경 사항을 추적 할 수 있도록했습니다. 내가 같은 테이블을 생성 한 감사를 들면SQL 서버에서 데이터 감사 만들기

[TableA] 
------ 
ID 
ColumnA 
ColumnB 
ColumnC 

:

나는 다음과 같은 테이블이 있다고 가정하자

[TableA.Audit] 
------ 
ID 
TableAID 
UserID 
Date (default value = getdate()) 
ColumnA 
ColumnB 
ColumnC 

그때 쓴 적이을 스크립트와 같은 :

DECLARE @currentColumnA int 
     ,@currentColumnB int 
     ,@currentColumnC int 

SELECT TOP 1 @currentColumnA=ColumnA 
      ,@currentColumnB=ColumnB 
      ,@currentColumnC=ColumnC 
FROM [TableA] 
WHERE [email protected] 

UPDATE [TableA] 
SET [email protected] 
    ,[email protected] 
    ,[email protected] 
WHERE [email protected] 

INSERT INTO [TableA.Audit] (TableAID, UserID, ColumnA, ColumnB, ColumnC) 
VALUES (@TableAID, @UserID, NULLIF(@ColumnA, @currentColumnA), NULLIF(@ColumnB, @currentColumnB), NULLIF(@ColumnC, @currentColumnC)) 

이 문제는 ColumnD 필드를에 추가하는 경우입니다. 0 위의 스크립트뿐만 아니라 TableA.Audit 테이블을 편집해야합니다.

따라서 더 좋은 방법이 있습니까?

+0

상황에 따라 [이 대답] (http://stackoverflow.com/questions/6998774/update-function-in-transact-sql-a-boolean-condition/7151476#7151476)이 도움이 될 수 있습니다. .(이것은 @HLGEM이 말하는 것의 단순화 된 버전입니다.) –

답변

3

AFTER INSERT, AFTER DELETE 및 AFTER UPDATE에 대한 테이블에 트리거를 작성하는 것이 좋습니다. 이렇게하면 테이블에 데이터를 삽입, 업데이트 또는 삭제하는 ANYTHING (응용 프로그램, Management Studio 등)이 기록됩니다. 감사 액션을위한 입력란을 추가해야하고 트리거에서 작업의 리터럴을 삽입해야합니다 (예 : 'I'또는 'INSERT'). 나는 이런 식으로 내 감사 테이블을 구성 : 우리의 애플 리케이션은 Active Directory를 사용

audit_id: INT IDENTITY 
audit_date: DATETIME GETDATE() 
audit_action: VARCHAR(16) ... or you can use CHAR(1) 
audit_user: VARCHAR(128) SUSER_SNAME() 
(the fields from the table being audited) 

때문에, 나는 SUSER_SNAME하는 audit_user 기본 수(). 이와

+0

ASP.NET 폼 인증/멤버쉽을 사용합니다. Trigger에 UserID를 가져 오는 방법이 있습니까? 현재 응용 프로그램에서 @UserID 매개 변수를 전달합니다. – Curt

+1

안녕하세요 폼 인증/회원 자격으로 어떻게 할 수 있습니까? – Curt

+0

회원 자격에 대해 잘 모르겠다. 사용하지는 않았지만 Active Directory가 아닌 솔루션의 경우 사용자 ID를 저장 프로 시저에 일반 기존 매개 변수로 전달해야합니다. – HardCode

0

문제는, 내가 TableA의에 ColumnD 필드를 추가 할 수 있다면 내가 스크립트 위의 뿐만 아니라 내 TableA.Audit 테이블을 편집 할거야 것입니다.

따라서 더 좋은 방법이 있습니까?

아니요. 트리거를 통해 HardCode 언급을 통해 구현을 향상시킬 수 있지만 여전히 감사 및 관련 scirpts를 수정해야합니다.

트리거 또는 감사 테이블을 업데이트 할 필요가없는 "개선 된"방법을 시도했습니다. 이것은 항상 사소한 문제를 처리하는 결과를 낳습니다. (더군다나 칼럼이 추가되었고 좀 더 많은 것들을해야했습니다. 일반적으로 성능, 정확성 및 안정성 문제.

1

우리는 트리거를 사용합니다 (다중 레코드 삽입/업데이트/삭제를 처리하기 위해 작성하는 유일한 방법이며 유일한 구조입니다). 우리의 구조는 약간 다릅니다. 먼저 작업에 대한 정보, 영향을받은 레코드의 날짜와 수를 기록한 사람/응용 프로그램에 대한 정보를 저장하는 테이블이 있습니다. 그런 다음 세부 정보를 저장하는 테이블이 있습니다. 이 테이블에는 식별자 열, column_name, 이전 값, 새 값이 있습니다. (우리는 감사 테이블의 열에 nvarchar (max)를 사용합니다.) 이렇게하면 테이블이 새로운 열을 가져 오면 감사 테이블을 변경하는 것에 대해 걱정할 필요가 없습니다. 감사하는 각 테이블에 대해 하나의 감사 테이블 세트가 있습니다.

최신 버전의 SQL Server에는 변경 내용 추적 기능이 있지만 필요한 감사에 대한 세부 정보가 충분하지 않으며 다른 영구 테이블로 이동하지 않으면 데이터가 너무 빨리 삭제됩니다.

관련 문제