2012-04-05 6 views
0

2番目のSQL Serverインスタンスに本番データベースとアーカイブデータベースがあります。ProductionデータベースのアーカイブSQL Server 2008の挿入/更新

本番データベースにデータを挿入または更新(削除しない)すると、同じデータをアーカイブデータベースに挿入または更新する必要があります。

これを行うにはどうすればよいですか?

おかげ

+0

アーカイブデータベースにトリガーを書き込んだ後にデータベースを開く – Teja

+0

@Vutukuriデータベースに大量のトランザクションがある場合はどうなりますか?適切な解決策になるでしょうか? – rvphx

答えて

1

彼らは同じDBインスタンスである場合は、トリガは、それがテーブルの多くではありませんと仮定すると些細なことでしょう。

このサイズが大きくなる場合は、SQL Serverレプリケーションを調べることをお勧めします。マイクロソフトは、それを正しく行うために多くの時間と費用を費やしてきました。

+0

データベースから削除されたデータがアーカイブDBから削除されないようにするために、私はレプリケーションを行うことができますか? – Maxime

+0

正しい。一方向レプリケーションを設定することができます(Production - > Archive)。アーカイブデータの変更はProductionには影響しません。 –

+0

プロダクションDBのエントリを削除すると、このエントリをアーカイブに保存する必要があります。プロダクションデータベース内のすべてのテーブルのデータは、毎日の始めに削除されます...それはそうですか? – Maxime

0

トリガーを使用することを検討している場合は、本番データベースの負荷サイズを考慮する必要があります。非常に集中的なデータベースの場合は、レプリケーションやミラーリング、ログ配布などの高可用性ソリューションを使用することを検討してください。お客様のニーズに応じて、いずれかのソリューションが適切に機能する可能性があります。 同時に、実装する内容に応じて変更する必要のある「コールド」リカバリソリューションも検討する必要があります。

0

レプリケーションでも削除されます。ただし、アーカイブデータベースから削除を削除しないと、本番データベースで値は有効ですが、値がすでにそこに存在するためアーカイブデータベースで有効ではない一意のインデックスの行に問題が発生する可能性があります。あなたのデザインが、これは問題ではないことを意味している場合、生産テーブル内の単純なトリガーはあなたのためにこれを行います。

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..MyTableArchiveServer.ArchiveDB..MyTableに置き換える必要があります。ここでArchiveServerはリンクサーバーの名前です。

ただし、本番データベースに既に多くの負荷がある場合は、これにより倍増することに注意してください。これを回避するために、各テーブルに更新フラグフィールドを追加し、データベースの負荷が最小である1時のような時点でスケジュールされたタスクを実行することができます。この場合、トリガーはフィールドを挿入の場合はI、運用データベースの更新の場合はUに設定し、スケジュールされたタスクはこのフィールドの値に応じて更新またはアーカイブデータベースへの挿入を行い、フィールドをリセットします終了したらNULLになります。

関連する問題