2009-05-29 7 views
1

J'ai écrit un déclencheur qui met à jour la table locale et la table similaire sur le serveur lié.Test de la conccetion du serveur lié à l'intérieur du déclencheur ou de la procédure

CREATE TRIGGER myTtableUpdate ON myTable
AFTER UPDATE AS
IF (COLUMNS_UPDATED() > 0)
BEGIN
DECLARE @retval int;
BEGIN TRY
EXEC @retval = sys.sp_testlinkedserver N'my_linked_server';
END TRY
BEGIN CATCH
SET @retval = sign(@@error);
END CATCH;

IF (@retval = 0)
BEGIN
UPDATE remoteTable SET remoteTable.datafield = i.datafield
FROM my_linked_server.remote_database.dbo.myTable remoteTable
INNER JOIN inserted i ON (remoteTable.id = i.id)
END
END -- end of trigger

Malheureusement lorsque la connexion est en panne je reçois le message d'erreur
'Msg 3616, niveau 16, état 1, ligne 2'
« Transaction condamnée à déclenchement. Le lot a été annulé '
et la mise à jour localement effectuée est annulée.

Existe-t-il un moyen de maintenir cette erreur et de conserver les mises à jour locales?
Notez que j'utilise SQL Server 2005 Express Edition sur les deux ordinateurs exécutant Windows XP Pro.

edit1: SQL Server Express Edition est
Edit2: Les deux PC exécutent Windows XP Pro, ce ne sont pas des serveurs

+0

voir mon dernier commentaire ... –

Répondre

1

ne pas écrire au serveur distant dans le déclencheur.

  • créer une table locale pour stocker les lignes qui doivent être poussés vers le serveur distant
  • insertion dans cette nouvelle table locale dans le déclencheur
  • créer un emploi qui passe toutes les minutes N pour insérer de cette section locale table dans le serveur distant.

Ce travail peut exécuter une procédure qui peut tester la connexion et, lorsqu'il est de secours, traiter toutes les lignes de la nouvelle table locale. Il peut traiter les lignes de la table locale de cette façon:

declare @OutputTable table (RowID int not null) 

insert into my_linked_server.remote_database.dbo.myTable remoteTable(...columns...) 
    OUTPUT INSERTED.RowID 
    INTO @OutputTable 
    SELECT ...columns... 
     from NewLocalTable 

delete NewLocalTable 
    from NewLocalTable   n 
     inner join @OutputTable o ON n.RowID=o.RowID 

EDIT base OP commentaire
après l'insertion dans cette nouvelle table locale commence le travail de la gâchette (sp_start_job), elle se déroulera dans son propre portée. Si vous ne pouvez pas utiliser les jobs SQL Server, utilisez xp_cmdshell pour exécuter la procédure stockée (recherchez SQLCMD ou ISQL ou OSQL, je ne suis pas sûr de ce que vous avez). planifiez toujours le travail toutes les N minutes, de sorte qu'il finira par s'exécuter lorsque la connexion sera établie.

+0

Cela pourrait presque fonctionner, sauf le retard du travail planifié. De plus, sur Express Edition, je devrais utiliser le planificateur Windows, ce qui rend le délai très long. – Ragnar

+0

Avec le planificateur, vous pouvez exécuter des tâches toutes les X minutes - si cela ne suffit pas, vous devrez revoir votre design et votre architecture. –

+0

Comme le résultat attendu était que la mise à jour serait immédiatement remplie ou, en cas d'erreur de réseau, jamais je n'aurais à exécuter le planificateur à chaque minute, ce qui ne semble pas être une solution très attrayante. – Ragnar

0

Est-ce qu'au moins l'un des serveurs Workgroup édition ou supérieur? Vous pouvez utiliser Service Broker pour expédier vos enregistrements au lieu de serveurs liés, mais cela ne fonctionnera pas entre les éditions Express en raison de restrictions de licence. Une solution reposant exclusivement sur SQL, offre une fiabilité en cas d'incidents (l'un des serveurs n'est pas disponible) et vos mises à jour se propagent en temps réel (dès qu'elles sont validées). Mon site a de nombreux exemples sur la façon de le faire, vous pouvez commencer par cet article ici sur how to achieve high message throughput.

+0

Je pourrais écrire une solution de contournement n'importe où dans l'application Java qui utilise cette table SQL, mais c'est comme pour un seul client, alors j'espérais pouvoir isoler le tout dans le déclencheur SQL et oublier. Merci pour l'article Service Broker. – Ragnar

Questions connexes