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
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
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
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. –