2009-03-05 6 views
3

Nous avons 2 bases de données, par exemple DB1 et DB2.
DB1 contient toutes les procédures stockées qui accèdent également aux données dans DB2.
DB1 utilise des synonymes pour accéder aux tables dans DB2.
(L'utilisation de synonymes est une exigence dans notre situation)SQL Server: Problème de transaction Snapshot avec des synonymes dans Express Edition

Cela fonctionne parfaitement dans toutes les situations avec SQL Server 2005 Developer Edition.

Cependant, dans l'Express Edition, nous obtenons une exception quand nous faisons ce qui suit:
1 Redémarrez SQL Server
2 Exécutez le code suivant dans DB1:

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

Cela se traduira par la suite erreur:

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.

La même requête select passe bien lorsqu'il est utilisé sans l'EXEC ou lorsqu'il est exécuté sur Developer Edition.
Le redémarrage du serveur à l'étape 1 est important car, une fois la connexion établie avec DB2, le code s'exécute également correctement sur SQL Server Express Edition.

Est-ce que quelqu'un a une idée de ce que c'est? Nous devons être en mesure d'utiliser EXEC pour certaines requêtes dynamiques. Nous avons déjà vérifié MSDN, recherché Google, ... Toute aide est grandement appréciée. Comme discuté avec Ed Harper ci-dessous, j'ai déposé un rapport de bogue pour cela.
Voir https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=422150

Répondre

3

Comme l'a constaté par Microsoft Connect, le problème est que par défaut sur SQL Server Express Edition l'option AUTO_CLOSE est situé sur vrai.
La modification de cette option à false résout le problème.

1

Le message d'erreur indique que la requête échoue parce que le serveur SQL récupère toujours la base de données suite au redémarrage du service lorsque vous exécutez votre requête.

L'erreur se produit-elle toujours lors de la première tentative d'exécution de ce code, quel que soit le délai écoulé depuis le redémarrage du service?

Pouvez-vous confirmer à partir du journal SQL Server que la base de données récupère correctement après le redémarrage?

+0

Le redémarrage est uniquement requis afin de s'assurer qu'aucune connexion à DB2 n'a été effectuée auparavant. L'erreur se produit indépendamment du temps écoulé, tant qu'aucune connexion à DB2 n'a été effectuée auparavant. – Marc

+0

J'ai vérifié le journal du serveur: Il n'y a pas d'erreur. Il dit "La récupération est terminée" et "Démarrage de DB1/DB2". On dirait que tout va bien. – Marc

+0

Cela ressemble à un bug dans Express. Pouvez-vous contourner ce problème en faisant exécuter une transaction défaillante après le redémarrage du service de base de données. –

Questions connexes