2017-02-17 1 views
1

트랜잭션 번호와 같이 증가 된 고유 키 값을 추적하는 SQL Server 2008R2 테이블이 있습니다. 이는 시퀀스 개체의 잘못된 버전과 같습니다. 이 테이블에는 약 300 개의 고유 키가 있습니다. 내 문제는 이전에 사용 된 번호를 유지하기 때문에 테이블에 여러 개의 100,000 개의 행이 증가한다는 것입니다. 제 문제는 일주일에 한 번 또는 성능이 저하되면 테이블을 정리해야한다는 것입니다. Truncate를 사용하고 SP를 시작하여 300 개의 키 각각에 대해 다음 증분 값을 생성하려고합니다. 이것은 약 5 분의 런타임으로 작동하지만,이 시간 동안 시스템은 데이터가 없기 때문에 테이블을 사용하고 오류를 던지려고합니다. 테이블을 잠그고 사용자 액세스를 차단하고 자물쇠를 자르고 올릴 수있는 방법이 있습니까?SQL 테이블을 자르는 동안 사용자를 차단하는 방법

+0

"DB에서 사용자를 어떻게 퇴장시킬 수 있습니까?" – ajeh

+0

다른 테이블에서 프로세스를 수행 한 다음, 완료되면 이전 테이블의 이름을 다른 것으로 변경하고 새 테이블을 "활성"테이블로 바꿀 수 있습니까? 그렇다면 즉각적인 것입니다 (잠시 멈추지 만 현재 5 분 정도는 아무데도 못하게됩니다). –

답변

3

TRUNCATE가 자동으로 전체 테이블을 잠급니다. delete 문은 사용자 쿼리를 방해하지 않는 행 잠금을 구현합니다. 당신은 근무 시간 외의 시간에 오래된 레코드를 없앨 생각을하고 싶을 것입니다.

1

독자의 협조가 필요합니다. serializable과 같이 차단 수준이 높은 격리 수준을 사용하지 않으려면 sp_getapplock 및 sp_releaseapplock을 사용하여 재생성 프로세스 중에 테이블을 보호 할 수 있습니다. https://msdn.microsoft.com/en-us/library/ms189823.aspx

새 테이블을 다른 테이블에 빌드 한 다음 sp_rename을 사용하여 테이블을 바꿀 수도 있습니다.

관련 문제