Question

Nous disposons de 2 bases de données, à savoir 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)

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

Toutefois, dans l'édition Express, nous obtenons une exception lorsque nous procédons comme suit:
1 Redémarrez SQL Server
2 Exécutez le code suivant dans DB1:

  

définir un instantané du niveau d'isolation des transactions
  commencer la transaction
  declare @sQuery varchar (max)
  set @sQuery = 'Sélectionnez * dans synToSomeTableInDB2'
  exec (@sQuery)
  validation de la transaction

Cela entraînera l'erreur suivante:

  

La transaction d'isolation de capture instantanée a échoué dans la base de données '...' car la base de données n'a pas été récupérée lors du démarrage de la transaction en cours. Réessayez la transaction après la récupération de la base de données.

La même requête de sélection réussit sans problème lorsqu'elle est utilisée sans EXEC ou lorsqu'elle est exécutée dans Developer Edition.
Il est important de redémarrer le serveur à l'étape 1, car une fois la connexion établie avec DB2, le code fonctionne également correctement sous SQL Server Express Edition.

Quelqu'un at-il une idée de ce que c'est? Nous devons pouvoir utiliser EXEC pour certaines requêtes dynamiques. Nous avons déjà vérifié MSDN, recherché Google, ... Toute aide est grandement appréciée.

--- Édition: Mars 10 09
Comme discuté avec Ed Harper ci-dessous, j'ai déposé un rapport de bogue à ce sujet.
Voir https://connect.microsoft.com/SQLServer/feedback/ViewFeedback .aspx? FeedbackID = 422150

Était-ce utile?

La solution

Comme indiqué par Microsoft Connect , le problème c’est que par défaut, dans SQL Server Express Edition, l’option AUTO_CLOSE est définie sur true .
La modification de cette option sur false résout le problème.

Autres conseils

Le message d'erreur suggère que la requête échoue car SQL Server restaure la base de données après le redémarrage du service lorsque vous exécutez votre requête.

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top