给定以下代码段:
-- error checking omitted for brevity
begin tran
exec database1..my_stored_procedure
exec database2..my_other_stored_procedure
if (@@error <> 0)
rollback
commit
事务信息将插入到哪个数据库的事务日志中?
我希望两个日志都能获取所有数据,因为如果您尝试重播database1
事务日志并且它只影响该数据库,那将毫无意义。我还希望您无法在不存在database1
的服务器上重播事务日志database2
,反之亦然。
..但我愿意更正!
正如您所料,事务日志没有记录正在执行的 SQL 语句。相反,它独立地记录每个数据库中原始数据的变化。
一个数据库中的存储过程可能完全在另一个数据库的事务日志中工作。
或者让它对两者都进行更改。
事务日志中记录的是实际的数据更改,而不是导致它们发生的 SQL 语句。每个事务日志文件的条目是完全独立的,除非在提交事务后将 COMMIT 同时写入两个日志文件。
如果您有一个较大的事务在多个数据库中运行多个存储过程,则同样的逻辑也适用。一旦你提交你的事务,提交将被记录在参与事务的每个数据库的日志中。
完全可以恢复 database2 的备份,并在没有 database1 的服务器上重放其事务日志。
这种行为允许在 SQL Server 中如何布局过程和视图方面具有一定的灵活性。许多数据库管理员将他们的存储过程——尤其是维护过程——保存在
Admin
与应用程序/用户数据库完全分离的数据库(例如)中,并将维护操作的结果写入该数据库。值得庆幸的是,可以将其中一个用户数据库恢复到开发服务器,而无需复制Admin
。