Журнал транзакций не записывает выполняемые операторы 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 и воспроизвести ее журналы транзакций на сервере, на котором нет базы данных1.
Такое поведение дает некоторую гибкость в том, как процедуры и представления выложены в SQL Server. Многие администраторы баз данных хранят свои хранимые процедуры - особенно процедуры обслуживания - в базе данных (например Admin
), которая полностью отделена от баз данных приложения / пользователя, и записывают результаты операции обслуживания в эту базу данных. К счастью, можно восстановить одну из пользовательских баз данных на сервере разработки без необходимости копирования Admin
.