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

残念ながら、接続がダウンすると
、「Msg 3616, Level 16, State 1, Line 2」というエラー メッセージが表示されます
。バッチが中止され
、ローカルで行われた更新がロールバックされました。

このエラーを維持し、ローカルの更新を維持する方法はありますか?
Windows XP Pro を実行している両方の PC で SQL Server 2005 Express Edition を使用していることに注意してください。

edit1: SQL サーバーは Express Edition
edit2: どちらの PC も Windows XP Pro を実行しているため、これらはサーバーではありません

4

2 に答える 2

2

トリガーでリモートサーバーに書き込まないでください。

  • リモート サーバーにプッシュする必要がある行を格納するためのローカル テーブルを作成する
  • トリガー内のこの新しいローカル テーブルに挿入します
  • このローカル テーブルからリモート サーバーに挿入するために、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 サーバー ジョブを使用できない場合は、xp_cmdshell を使用してストアド プロシージャを実行します (SQLCMD または ISQL または OSQL を参照してください。何があるかわかりません)。N 分ごとにジョブをスケジュールするため、最終的には接続が確立されたときに実行されます。

于 2009-05-29T15:16:06.307 に答える
0

少なくとも 1 つのサーバーが Workgroup エディション以上ですか? リンク サーバーの代わりに Service Broker を使用してレコードを送信できますが、ライセンスの制限により、Express エディション間では機能しません。SQL のみに依存するソリューションであり、インシデントが発生した場合 (サーバーの 1 つが利用できない場合) に信頼性を提供し、更新はリアルタイムで (コミットされるとすぐに) 伝達されます。私のサイトには、これを行う方法に関する多くの例があります。高メッセージ スループットを達成する方法に関するこの記事から始めることができます。

于 2009-05-29T15:59:35.683 に答える