正如您所期望的那样,事务日志未记录正在执行的SQL语句。相反,它是独立记录每个数据库中原始数据的更改。
一个数据库中存储的proc可能完全在另一个数据库的事务日志中工作。
... 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同时写入两个日志文件。
如果您有一个较大的事务在多个数据库中运行许多存储过程,则适用相同的逻辑。一旦提交事务,该COMMIT将记录在参与该事务的每个数据库的日志中。
完全有可能还原database2的备份,并在没有database1的服务器上重播其事务日志。
此行为为在SQL Server中如何布置过程和视图提供了一定的灵活性。许多数据库管理员将他们的存储过程(尤其是维护过程)保存在Admin
与应用程序/用户数据库完全独立的数据库(例如)中,并将维护操作的结果写入该数据库。值得庆幸的是,可以将用户数据库之一还原到开发服务器,而无需复制Admin
。