Est-il possible de mettre à jour une database SQL Server et une database Informix en même time?

Je me demandais s'il est possible d'append / mettre à jour / supprimer une table de database SQL Server, ainsi qu'une table de database Informix en même time.

Les deux bases de données auront la même table (data et all), donc la requête ne changera que selon la database dans laquelle elle va. Pour une raison quelconque, nous avons besoin des données dans les deux bases de données et maintenues en time réel.

Est-il possible de le faire avec un triggersur SQL ou peut-être un SProc?

Tout aperçu de la façon de le faire, ou une poussée dans la bonne direction serait très appréciée.

Faire une mise à jour synchrone, c'est à dire. une transaction dissortingbuée en utilisant un server lié, possible pour un triggersur, alors que techniquement possible, je déconseillerais définitivement. Aaron apporte la question de la fiabilité du XA en général, mais mon sharepoint vue est différent: la disponibilité. Votre mise à jour dans SQL Server échouera si elle ne peut pas se connecter et se mettre à jour dans Informix. Les time d'arrêt (patch, maintenance, sans parler des catastrophes) du site Informix impliqueront des time d'arrêt du site SQL Server, conduisant vos cinq 9 à 9,5 plutôt rapidement … C'est pourquoi je préconise fortement le découplage de l'application des mises à jour. La réplication transactionnelle est un exemple de découplage et prend en charge des environnements hétérogènes (par exemple, le client Informix en aval pour accepter les modifications).

Vous aurez un timeout de mise à jour de la visibilité (l'état dans SQL Server sera reflété dans Informix après le timeout qui peut être millisecondes, secondes, minutes, voire heures dans une mauvaise journée). Et les mises à jour sont à sens unique, rien ne revient d'Informix à SQL Server. Mais faire une réplication maître-maître dans un environnement hétérogène est quelque chose que même Chuck Norris n'essaierait pas de dire.

La gestion de deux SGBD différents avec une seule transaction nécessite un moniteur de transaction tel que le système XA pour coordonner les transactions. Il y a de tels systèmes. La spécification XA est généralement la norme sous-jacente. SQL Server de Microsoft et IBM Informix fonctionnent tous deux avec de tels systèmes, et il est possible que SQL Server et Informix soient contrôlés par le même moniteur de transaction. J'ai less de scrupules quant à la compétence technique de tels systèmes que les autres qui ont répondu; Je partage leurs préoccupations quant à savoir si cela vous convient.

De tels systèmes sont très lourds. Si vous voulez la cohérence, toutes les transactions qui modifient la table unique décrite dans la question devront utiliser les mêmes services XA (pluriel, probablement un pour insert, un pour la mise à jour, un pour supprimer) pour le faire. De plus, si les mêmes transactions doivent également gérer d'autres tables, vous devez également append et utiliser des services pour ces tables. C'est cet aspect qui rend ces systèmes difficiles à gérer.

L'utilisation d'un système de réplication avec un potentiel de retard avant que les sites ne soient cohérents est probablement préférable à une synchronisation absolue, à less qu'il y ait des requests convaincantes pour une telle synchronicité.

S'il y a vraiment une request de synchronicité absolue, utilisez un moniteur de transaction.

  • Ne roule pas le tien.

Ils sont difficiles à get correctement. Manipuler tous les cas spéciaux est délicat. Et (sous l'hypothèse que vous avez besoin d'une synchronicité absolue) le faire mal est coûteux mais facile.

Cela dépend de votre définition de "possible". Techniquement, vous pouvez utiliser une technique appelée " validation en deux phases ".

L'idée est que vous envoyez datatables aux deux bases de données, puis une command "prepare commit" qui fait tout le nécessaire pour valider datatables, sauf pour le valider. Si la préparation échoue, le commit échouera aussi. Si la préparation réussit, alors la validation doit réussir.

Idée shinye, ne fonctionne pas dans la pratique. Un cas courant est que vous envoyez la validation aux deux bases de données et que l'une d'elles se perd en path (panne de réseau). Cela arrive rarement mais quand cela arrive, vous avez un état incohérent et, puisque cette étape ne doit pas échouer, pas de bon moyen de nettoyer.

Donc, ma solution fonctionne comme ceci:

  1. Vous chargez datatables dans une nouvelle table qui a deux colonnes supplémentaires où vous pouvez dire "le server X a vu cet logging"

  2. Vous ajoutez un travail qui copy tous les travaux du server X vers le server X et met à jour la colonne correspondante. Ecrivez le travail de telle sorte qu'il puisse être interrompu et redémarré à tout moment (c'est-à-dire qu'il doit être capable de gérer les cas où des données existent déjà du côté de la cible).

Ainsi, vous pouvez répartir datatables sur un nombre illimité de servers de manière cohérente et tolérante aux pannes.