トランザクションログは、ご想像のとおり、実行中のSQLステートメントを記録していません。代わりに、各データベースの生データへの変更を個別に記録しています。
あるデータベースのストアドプロシージャが別のデータベースのトランザクションログで完全に機能している可能性があります。
... database1..my_stored_procedure AS
BEGIN
INSERT INTO database2..table1 (col1) values (1);
^^ changes written to database2's tlog
INSERT INTO database2..table2 (col1) values (2);
^^ changes written to database2's tlog
END
^^ when this transaction is committed, COMMIT is recorded in database2's tlog
または、両方に変更を加えるために。
... database2..my_other_stored_procedure AS
BEGIN
INSERT INTO database1..table1 (col1) values (1);
^^ changes written to database1's tlog
INSERT INTO database2..table1 (col1) values (2);
^^ changes written to database2's tlog
END
^^ when this transaction is committed, COMMIT is recorded in BOTH database1's and database2's tlog
トランザクションログに記録されるのは、実際のデータ変更であり、それらを発生させたSQLステートメントではありません。各トランザクションログファイルへのエントリは完全に独立しています。ただし、トランザクションがコミットされると、COMMITが2つのログファイルに同時に書き込まれる場合を除きます。
複数のデータベースにわたって多数のストアドプロシージャを実行する大規模なトランザクションがある場合も、同じロジックが適用されます。トランザクションをCOMMITすると、COMMITはトランザクションに参加したすべてのデータベースのログに記録されます。
database2のバックアップを復元し、database1がないサーバーでトランザクションログを再生することは完全に可能です。
この動作により、SQL Serverでのプロシージャとビューのレイアウト方法にある程度の柔軟性が与えられます。多くのデータベース管理者は、ストアドプロシージャ、特にメンテナンスプロシージャAdmin
を、アプリケーション/ユーザーデータベースとは完全に別のデータベース(例:)に保持し、メンテナンス操作の結果をそのデータベースに書き込みます。ありがたいことに、ユーザーデータベースの1つを開発サーバーに復元することもできますAdmin
。コピーする必要はありません。