2010-12-10 3 views
1

특정 ms SQL 2005 테이블 (asp.net 웹 응용 프로그램, C# Windows 서비스, 전자 메일 구문 분석기를 데이터베이스 자동화 도구로 업데이트하는 여러 응용 프로그램이 있습니다 SQL + VB)를 사용합니다.) 감사 정보를 테이블에 저장하려고합니다. 예 : ModifiedBy, ModifiedDate 여기서 ModifiedBy = 레코드를 갱신하는 어플리케이션의 이름.여러 응용 프로그램에서 공유하는 SQL 데이터베이스에 감사 및 아카이브 정보를 생성하는 가장 쉬운 방법

또한 정보를 테이블에 보관하고 싶습니다. 특정 레코드를 업데이트 할 때 myTable_Archive 테이블에 현재 레코드를 저장하고 날짜로 스탬프 처리하고 이에 따라 myTable의 현재 레코드를 업데이트합니다.

기존 응용 프로그램에 미치는 영향을 최소화하면서이를 유지 보수하고 테스트 할 수있는 가장 좋은 방법은 무엇입니까? 아니면 누군가가 더 나은 경로를 제안 할 수 있습니까? 저장 프로 시저, C# 공유 라이브러리 (nhibernate/ado.net 등 사용) 또는 ms sql 2005 기본 제공 기능 (예를 들어)이 있으면 호출합니다.

답변

2

이런 종류의 감사를 수행하는 가장 유지 보수가 가능한 (그리고 상당히 표준적인) 방법은 해당 테이블에서 triggers을 사용하는 것입니다.

데이터베이스에 완전히 존재하기 때문에 응용 프로그램이 전혀 변경되지 않습니다.

물론 트리거는 성능에 영향을 미칩니다 (이제는 호출에서 둘 이상의 표를 변경하기 때문에).

+0

감사를 통해 이름을 얻을 수 있습니다, 그것은 가장 가능성이 내 시나리오를 해결할 작은 변화의 제안입니다. Trigger에서 호출하는 응용 프로그램이나 프로세스를 확인하여 ModifiedBy (응용 프로그램 이름) 필드에서 사용할 수있는 방법이 있습니까? –

+0

@Luke Hutton - 연결 문자열에이 정보가 포함되어 있으면 시스템 테이블에서 정보를 검색 할 수 있어야합니다. 덕분에 @ 콘래드 Frix – Oded

+0

에서 답변을 참조하십시오,이 경로를 내려갈 것입니다, 트리거 주위에 몇 가지 테스트를 만들 것입니다. –

2

가장 쉬운 방법은 via 트리거입니다. ModifiedBy = 응용 프로그램 이름 요구 사항을 얻으려면 다음 두 가지 작업을 수행해야합니다.

1) 응용 프로그램 이름을 으로 설정하기 위해 Connections 문자열을 업데이트하십시오. ..Database=Foo;Application Name = Parser;

2) 그런 다음 트리거는

select program_name from sys.dm_exec_sessions where session_id = @@SPID

+0

수정 된 답변에 +1 –

관련 문제