2 番目の SQL Server インスタンスに運用データベースとアーカイブ データベースがあります。
本番データベースでデータを挿入または更新する (削除しない) 場合、アーカイブ データベースでも同じデータを挿入または更新する必要があります。
それを行うための良い方法は何ですか?
ありがとう
2 番目の SQL Server インスタンスに運用データベースとアーカイブ データベースがあります。
本番データベースでデータを挿入または更新する (削除しない) 場合、アーカイブ データベースでも同じデータを挿入または更新する必要があります。
それを行うための良い方法は何ですか?
ありがとう
それらが同じ db インスタンスにある場合、多くのテーブルではないと仮定すると、トリガーは簡単です。
このサイズが大きくなる場合は、おそらく SQL Server のレプリケーションを検討する必要があります。マイクロソフトは、それを正しく行うために多くの時間とお金を費やしてきました。
複製により、削除も複製されます。ただし、アーカイブ データベースから削除を削除しないと、一意のインデックスで問題が発生する可能性があります。この場合、値は運用データベースでは有効ですが、アーカイブ データベースでは値が既に存在するため有効ではありません。あなたの設計がこれが問題ではないことを意味している場合、本番テーブルの単純なトリガーはあなたのためにこれを行います:
CREATE TRIGGER TR_MyTable_ToArchive ON MyTable FOR INSERT, UPDATE AS
BEGIN
SET ROW_COUNT OFF
-- First inserts
SET IDENTITY_INSERT ArchiveDB..MyTable ON -- Only if identity column is used
INSERT INTO ArchiveDB..MyTable(MyTableKey, Col1, Col2, Col3, ...)
SELECT MyTableKey, Col1, Col2, Col3, ...
FROM inserted i LEFT JOIN deleted d ON i.MyTableKey = d.MyTableKey
WHERE d.MyTableKey IS NULL
SET IDENTITY_INSERT ArchiveDB..MyTable OFF -- Only if identity column is used
-- then updates
UPDATE t SET Col1 = i.col1, col2 = i.col2, col3 = i.col3, ...
FROM ArchiveDB..MyTable t INNER JOIN inserted i ON t.MyTableKey = i.MyTableKey
INNER JOIN deleted d ON i.MyTableKey = d.MyTableKey
END
これは、アーカイブ データベースが本番データベースと同じサーバー上にあることを前提としています。そうでない場合は、リンク サーバー エントリを作成し、 を に置き換える必要がありArchiveDB..MyTable
ます。ArchiveServer.ArchiveDB..MyTable
ここArchiveServer
で、 はリンク サーバーの名前です。
ただし、本番データベースにすでに多くの負荷がかかっている場合は、負荷が 2 倍になることに注意してください。これを回避するには、各テーブルに更新フラグ フィールドを追加し、午前 1 時など、データベースの負荷が最小になる時間にスケジュールされたタスクを実行します。次に、トリガーはフィールドを本番データベースI
の挿入またはU
更新用に設定し、スケジュールされたタスクを実行してから、このフィールドの値に応じてアーカイブ データベースで更新または挿入し、フィールドをNULL
一度にリセットします。終了しました。
これにトリガーを使用することを検討している場合は、本番データベースの負荷サイズを考慮する必要があります。非常に負荷の高いデータベースの場合は、レプリケーション、ミラーリング、ログ配布などの高可用性ソリューションの使用を検討してください。ニーズに応じて、どちらのソリューションも適切に機能します。また同時に、実装内容に応じて変更する必要がある「コールド」リカバリ ソリューションを検討する必要があります。