2番目のSQL Serverインスタンスに本番データベースとアーカイブデータベースがあります。ProductionデータベースのアーカイブSQL Server 2008の挿入/更新
本番データベースにデータを挿入または更新(削除しない)すると、同じデータをアーカイブデータベースに挿入または更新する必要があります。
これを行うにはどうすればよいですか?
おかげ
2番目のSQL Serverインスタンスに本番データベースとアーカイブデータベースがあります。ProductionデータベースのアーカイブSQL Server 2008の挿入/更新
本番データベースにデータを挿入または更新(削除しない)すると、同じデータをアーカイブデータベースに挿入または更新する必要があります。
これを行うにはどうすればよいですか?
おかげ
彼らは同じ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
はリンクサーバーの名前です。
ただし、本番データベースに既に多くの負荷がある場合は、これにより倍増することに注意してください。これを回避するために、各テーブルに更新フラグフィールドを追加し、データベースの負荷が最小である1時のような時点でスケジュールされたタスクを実行することができます。この場合、トリガーはフィールドを挿入の場合はI
、運用データベースの更新の場合はU
に設定し、スケジュールされたタスクはこのフィールドの値に応じて更新またはアーカイブデータベースへの挿入を行い、フィールドをリセットします終了したらNULL
になります。
アーカイブデータベースにトリガーを書き込んだ後にデータベースを開く – Teja
@Vutukuriデータベースに大量のトランザクションがある場合はどうなりますか?適切な解決策になるでしょうか? – rvphx