2017-04-13 12 views
0

다양한 테이블의 값을 변경하기 위해 SQL을 호출하는 다중 사용자 응용 프로그램이 있습니다. 이러한 테이블 중 일부에는 변경 사항을 감사하기위한 트리거가 있습니다. @@ SPID가 반환하는 SPID 값과 일치하도록 시도하는 코드가 트리거에 있으며 사용자가 DB 액세스 (로그인)를 위해 등록 할 때 SPID 값이 저장됩니다.SQL 호출자의 SPID를 얻는 방법

그러나 필자의 테스트에 따르면 트리거 실행시의 SPID는 이전에 저장 한 SPID와 같지 않습니다. 트리거를 실행시킨 DB를 변경 한 연결의 SPID를 어떻게 얻을 수 있습니까? 아니면 SPID가 아니라면 현재 변경된 SQL 연결을 상당히 안정적으로 식별 할 수있는 가치가 있습니까?

중간 생성 디버깅 용으로, 영구 생산 코드의 일부가 아닌 며칠에서 수 주일 동안 실제 시스템에서 실행해야합니다.

답변

1

@@SPID을 사용하는 대신 해당 세션에서 SQL Server 인스턴스에 처음 연결 한 로그인 ID를 반환하는 SQL Server 기능 ORIGINAL_LOGIN()을 사용할 수 있습니다.

+0

어 ... TIL - ORIGINAL_LOGIN() 매우 유용 할 수 있습니다. +1 –

0

SPID는 다른 사용자가 공유하지 않는 영구 데이터베이스 연결을 사용하는 경우에만 전체 사용자 세션에서 동일합니다. SPID가 감사에 제공 할 가치가 얼마나되는지 모르지만 데이터베이스 업데이트 활동을 특정 사용자 세션 인스턴스와 상관시키는 방법을 찾고있는 것으로 보입니다. 데이터베이스 연결에 대해 최종 사용자의 서비스 자격 증명 대신 서비스 자격 증명을 사용하는 경우 ORIGINAL_LOGIN은 감사에 도움이되지 않습니다.

트리거 코드에서 사용할 SQL 버전에 따라 CONTEXT_INFO 또는 SESSION_CONTEXT()에 세션 식별자 (예 : guid)를 저장할 수 있습니다. 코드 예는 How to add custom attributes to SQL connection string?을 참조하십시오.