2009-03-05 4 views
3

DB1과 DB2 등 2 개의 데이터베이스가 있습니다.
DB1에는 DB2의 데이터에 액세스하는 모든 저장 프로시 듀어가 들어 있습니다.
DB1은 동의어를 사용하여 DB2의 테이블에 액세스합니다.
(우리의 상황에서는 동의어 사용이 필요합니다.)SQL Server : Express Edition의 동의어에 대한 스냅 샷 트랜잭션 문제

이것은 SQL Server 2005 Developer Edition의 모든 상황에서 완벽하게 작동합니다. DB1에서 다음 코드를 실행
1 SQL Server를 다시 시작
2 :

set transaction isolation level snapshot
begin transaction
declare @sQuery varchar(max)
set @sQuery = 'Select * from synToSomeTableInDB2'
exec (@sQuery)
commit transaction

이 다음에 발생합니다 우리는 다음 작업을 수행 할 때

는 그러나 Express Edition을, 우리는 예외가 오류 :

Snapshot isolation transaction failed in database '...' because the database was not recovered when the current transaction was started. Retry the transaction after the database has recovered.

EXEC를 사용하지 않거나 Developer Edition에서 실행할 때 동일한 선택 쿼리가 정상적으로 통과됩니다.
일단 DB2에 연결되면 SQL Server Express Edition에서도 코드가 잘 실행되므로 1 단계에서 서버를 다시 시작하는 것이 중요합니다.

누구에게 아이디어가 있습니까? 일부 동적 쿼리에 EXEC를 사용할 수 있어야합니다. 우리는 이미 MSDN을 확인하고 Google을 검색했습니다 ... 도움을 주시면 대단히 감사하겠습니다.

--- 편집 : 3 월 10 일 09
아래의 Ed Harper와 논의한대로이 문제에 대한 버그 신고를 제출했습니다.
https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=422150

답변

3

바와 같이 Microsoft Connect를 통해 발견, 문제는 SQL Server Express를 판에 기본적으로 AUTO_CLOSE 옵션이 사실에 설정되어 있다는 점이다.
이 옵션을 으로 변경하면 거짓으로 문제가 해결됩니다.

1

오류 메시지는 쿼리를 실행할 때 SQL 서버가 서비스를 다시 시작한 후에도 데이터베이스를 복구하기 때문에 쿼리가 실패 함을 나타냅니다.

서비스를 다시 시작한 이후 경과 한 시간에 관계없이이 코드를 처음 실행하면 오류가 항상 발생합니까?

다시 시작한 후 데이터베이스가 올바르게 복구되고 있는지 SQL Server 로그에서 확인할 수 있습니까?

+0

재시작은 이전에 DB2에 연결하지 않았는지 확인하기 위해서만 필요합니다. 이전에 DB2에 연결되지 않은 한, 경과 된 시간에 관계없이 오류가 발생합니다. – Marc

+0

서버 로그를 확인했습니다 : 오류가 없습니다. "복구가 완료되었습니다"및 "DB1/DB2 시작 중"이라고 표시됩니다. 괜찮을 것 같습니다. – Marc

+0

Express에서 버그와 같은 소리가납니다. 데이터베이스 서비스를 다시 시작한 후에 실패한 트랜잭션을 실행하여 해결할 수 있습니까? –