2011-02-03 3 views
0

트리거가 트리거를 통해 트리거 된 업데이트로 인해 레코드가 잠겨 있지 않은 상태에서 트리거를 통해 감사 테이블의 레코드를 업데이트하는 방법이 있습니까?데이터베이스 잠금이없는 트리거를 통한 SQL 업데이트

그래서 우리는 사용자 테이블과 삽입, 업데이트, 삭제시 발생하는 트리거를 사용하여 변경된 값을 일부 감사 테이블에 기록하지만 감사 테이블이 잠겨서 다른 트리거가 작업을 수행하지 못하도록하고 싶지는 않습니다. 감사 테이블에서.

편집 :는 명확히하기 위해, 내가 가지고있는 문제가 여러 테이블이 다른 트리거를 통해 같은 감사 테이블에보고 있음을, 그래서 하나의 테이블 잠금 업데이트되는 다른 모든 테이블에 대한 업데이트. 트랜잭션이 롤백되는 경우에 대한 우려 사항은 감사 테이블이 변경 추적만을위한 것이며 감사 레코드가 롤백되면 감사 테이블이 롤백되지 않으면 문제가되지 않는 것과 같은 우려가되지 않습니다.

나는 그것이 작동하는 방법을 생각해 냈지만 이것이 가능한지 (또는 어떻게 할 수 있을지) 모르겠다. 처음에 호출 된 트리거 대신 새로운 연결을 사용하는 방법이 있습니까?

+0

트랜잭션이 롤백되면 다른 프로세스가 감사 테이블의 레코드를 읽으려고합니까? –

+0

감사 테이블의 데이터를 잠그고 싶습니다. 진짜 문제는 감사 테이블의 리프 노드를 핫 스폿으로 지정하여 감사 테이블에 모든 인서트를 동일한 리프 노드 페이지에 넣는 감사 테이블에 순차적 (가능하면 클러스터 된) 기본 키 인덱스가있는 것입니다 시간. 기본 키를 더 무작위 정렬로 변경하면 잠금 문제가 해결됩니다. –

답변

0

적어도 기록중인 레코드/페이지에 쓰기 잠금을 설정하지 않은 작업은 만들 수 없습니다. 그렇지 않으면 SQL Server는 일관성 문제가 항상 발생합니다. 당신은 반대 각도에서보고되어야한다 - 사용해야합니다 (감사는 일반적으로 업데이트 없음 만 조금 읽을 의미) 감사 테이블에 액세스하는 데 필요한 다른 프로세스를

SET TRANSACTION ISOLATION LEVEL SNAPSHOT 
or 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

어떤 것 - 더티 읽기 (또는 잠그지 않고 버전) 감사 테이블

당신이해야합니다 ..에서
대신 중간 테이블에 데이터를 삽입하고 SSSB asychronous 활성화 스레드가 쓰기함으로써 서비스 브로커를 사용하여 트랜잭션에서 쓰기를 분리하는 비열한 방법이있다 감사 기록으로, 원래의 장기 실행 트랜잭션이 unco로 남아있게합니다. mmitted.

+0

데이터 저장 관점에서 SQL은 레코드 잠금이 페이지 잠금으로 확대 될 때까지 제대로 작동 할 수있는 것처럼 보입니다. 따라서 시스템이 실행되는 동안 감사 테이블을 읽는 것과 관련하여이 질문에 대한 답변을 얻을 수 있습니다. – Seph

관련 문제