2009-05-29 14 views
1

リンクサーバー上のローカルテーブルと同様のテーブルを更新するトリガーを作成しました。トリガーまたはプロシージャー内でリンクされたサーバー接続をテストする

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

接続がダウンしているとき、残念ながら、私は、エラーメッセージ
トリガーに運命 'メッセージ3616、レベル16、状態1、行2'
」トランザクションを取得します。バッチが中止されました。 '
ローカルに作成された更新はロールバックされます。

このエラーを解決してローカルアップデートを維持する手段はありますか?
Windows XP Proを実行している両方のPCでSQL Server 2005 Express Editionを使用しています。

EDIT1:両方のPC Proは、Windows XPを実行するので、これらは

+0

最新のコメントを参照してください... –

答えて

1

が引き金で、リモートサーバに書いていないサーバーではありません:SQLサーバーは、Express Editionを
EDIT2です。

  • リモートサーバー
  • にプッシュする必要がある行を格納
  • トリガーにこの新しいローカルテーブルに挿入このローカルから挿入するために、すべてのN分を実行するジョブを作成するために、ローカルテーブルを作成しますテーブルをリモートサーバーに追加します。

このジョブでは、接続をテストできるプロシージャを実行できます。また、バックアップ時には、新しいローカルテーブルのすべての行が処理されます。これは、ローカルの表に、このように行を処理することができます

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ベースのOPのコメント
をこの新しいローカルテーブルに挿入した後にトリガ(sp_start_job)からジョブを開始、それはそれ自身で実行されます範囲。 SQL Serverジョブを使用できない場合は、xp_cmdshellを使用してストアドプロシージャ(SQLCMDまたはISQLまたはOSQLの参照)を実行します。 N分ごとにジョブをスケジュールするので、接続が開始されたときに最終的に実行されます。

+0

これは、スケジュールされたジョブの遅延を除いてほとんど機能します。 Express Editionでは、Windowsのスケジューラを使用する必要があります。これは、遅延をreeeeeally長くします。 – Ragnar

+0

スケジューラを使用すると、X分ごとに作業を実行できます。十分でない場合は、デザインとアーキテクチャを再訪する必要があります。 –

+0

予想される結果は、更新プログラムにはすぐに値が設定されることになっていたため、ネットワークエラーの場合は、決して非常に魅力的なソリューションのように見えない毎分のスケジューラを実行する必要があったはずです。 – Ragnar

0

ワークグループエディション以上のサーバーの少なくとも1つですか? Service Brokerを使用すると、リンクされたサーバーの代わりにレコードを送信できますが、ライセンスの制限によりエディションをExpressに切り替えることはできません。 SQLのみに依存するソリューションで、インシデントの場合に信頼性を提供し(サーバーの1つが利用できない)、更新内容が(コミット後すぐに)反映されます。私のサイトにはこれを行う方法に関する多くの例があります。この記事はhow to achieve high message throughputから始めることができます。

+0

私はこのSQLテーブルを使用するJavaアプリケーションのどこにでも回避策を書くことができましたが、これは1人の顧客のみたいなものなので、SQLトリガで全体を分離して忘れて欲しいと思っていました。 Service Brokerの記事に感謝します。 – Ragnar

関連する問題