2009-01-15 6 views
6

J'essaie de tester une proposition que l'un de nos fournisseurs nous a présentée pour accéder à sa base de données de produits et concernant les requêtes et les transactions qui couvrent plusieurs serveurs. Je n'ai jamais fait cela directement sur la base de données avant et pour être franc, je suis désemparé, alors j'essaye de faire une démonstration que cela fonctionne au moins conceptuellement.Comment puis-je utiliser des transactions couvrant des procédures chaînées sur plusieurs serveurs?

J'ai deux serveurs SQL Server 2005. Pour l'amour de l'argument, appelons-les Server1 et Server2 [maintenez vos applaudissements] chacun contenant une base de données factice. La base de données factice sur Serveur1 est appelée Source et celle sur Serveur2 est appelée Destination, juste pour garder les choses simples. Les bases de données occupent chacune une seule table appelée entrée et de sortie respectivement, de sorte que la structure est quasi expliqué comme ceci:

  • Server1.Source.dbo.Input
  • Server2.Destination.dbo.Output

J'ai une procédure stockée sur Server2 appelée WriteDataToOutput qui reçoit un seul argument Varchar et écrit son contenu dans la table de sortie.

Maintenant, la rouerie commence:

  1. Je veux créer une procédure stockée sur Server1.Source qui appelle la procédure stockée WriteDataToOutput définie sur Server2, ce qui semble être l'étape simple.
  2. Je souhaite que cet appel fasse partie d'une transaction afin que, si la procédure qui l'invoque échoue, la transaction entière soit annulée.

Et cela finit ma connaissance de ce qu'il faut faire. Est-ce que quelqu'un peut-il me montrer la bonne direction? J'ai essayé cela sur deux bases de données différentes sur le même serveur, et cela a très bien fonctionné, ce qui m'a amené à supposer que cela fonctionnera sur différents serveurs, la question est, comment puis-je faire une telle chose? Où est-ce que je commence?

+0

+1 pour une question bien écrite –

Répondre

5

Comme d'autres l'ont noté, je suis d'accord qu'un serveur lié est la meilleure façon d'aller.

Voici quelques conseils qui me snagged la première fois je me suis occupé des serveurs liés:

  • Si le serveur lié est une instance, assurez-vous du bracketing le nom. Par exemple [SERVERNAME \ INSTANCENAME].

  • Utilisez un alias pour la table ou vue depuis le serveur lié ou vous obtiendrez un « identifiant plusieurs parties ne peut pas être lié » erreur. Il y a une limite d'une convention de nommage en 4 parties. Par exemple SERVER.DATABASE.dbo.TABLE.FIELD a cinq parties et donnera une erreur. Cependant, SELECT linked.FieldName FROM SERVER.DATABASE.dbo.TABLE AS linked fonctionnera bien

+0

+1 Merci de remarquer les pièges et les solutions possibles – BenAlabaster

0

Vous devez créer un lien entre un serveur et un autre.

3

pour l'étape 2, vous devez avoir distribué en cours d'exécution Coordinateur de transactions, vous devez également utiliser SET XACT_ABORT ON pour vous assurer que cela va rollback vous devez également activer RPC qui est désactivé par défaut en 2005 et jusqu'à

Il y a un tas de choses qui peuvent vous mordre dans le cou

1

en utilisant des serveurs liés, vous pouvez exécuter des procédures stockées sur deux serveurs au sein d'une seule transaction en utilisant DTC (Distributed coordonnateur Transactino). Vous aurez certainement envie de faire une analyse de performance. J'ai constaté que certains fournisseurs de services utilisant des liens peuvent considérablement ralentir les performances de la base de données, en particulier si vous essayez de joindre les ensembles de résultats de chacun des deux serveurs.

+0

+1 Merci pour le conseil, je voudrais l'utiliser pour pousser certaines données financières d'une base de données d'opérations à une base de données financière. En tant que tel, il n'y aurait pas beaucoup besoin de cross-jointures DB. – BenAlabaster

0

Configurez un serveur lié, vous devriez alors pouvoir exécuter des sélections/insertions/mises à jour sur les serveurs. Quelque chose comme:

INSERT INTO Server2.Destination.dbo.Output 
SELECT * FROM Input 
WHERE <Criteria> 

Cela suppose que vous exécutez la requête de Server1.Source, de sorte que vous ne auriez pas besoin de se qualifier pleinement.

+0

Je remettrions une procédure stockée qui est définie sur Server2.Destination – BenAlabaster

+0

ne faut pas oublier qu'il veut faire reculer tout, donc vous devez exécuter DTC, SET XACT_ABORT ON – SQLMenace

2

MSDN dit que vous pouvez avoir des transactions sur les serveurs liés si vous utilisez la commande BEGIN TRANSACTION DISTRIBUÉ.

Je me souviens bien que j'avais des problèmes appelé une procédure stockée sur un serveur lié, mais je travaille autour d'elle, au lieu de le résoudre.

Questions connexes