Ao executar uma transação entre bancos de dados, em quais logs de transações as informações são armazenadas?

9

Dado o seguinte snippet:

-- error checking omitted for brevity
begin tran

exec database1..my_stored_procedure
exec database2..my_other_stored_procedure

if (@@error <> 0)
  rollback

commit

Em quais logs de transações do banco de dados as informações transacionais serão inseridas?

Eu esperaria que os dois logs obtivessem todos os dados, pois não faria sentido se você tentasse reproduzir database1o log de transações e isso afetasse apenas esse banco de dados. Eu também esperaria que você não pudesse reproduzir database1o log de transações em um servidor onde database2não estivesse presente e vice-versa.

.. mas estou aberto a correções!

Ian Kemp
fonte

Respostas:

13

O log de transações não está registrando as instruções SQL que estão sendo executadas, como você poderia esperar. Em vez disso, está registrando as alterações nos dados brutos em cada banco de dados, independentemente.

É possível que um processo armazenado de um banco de dados esteja funcionando inteiramente no log de transações de outro banco de dados.

... 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

Ou para fazer alterações nos dois.

... 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

O que é registrado no log de transações são as alterações reais dos dados , não as instruções SQL que as causaram. As entradas para cada arquivo de log de transações são totalmente independentes, exceto na medida em que o COMMIT é gravado nos dois arquivos de log ao mesmo tempo, depois que a transação é confirmada.

A mesma lógica se aplica se você tiver uma transação maior executando vários procedimentos armazenados em vários bancos de dados. Depois de confirmar sua transação, o COMMIT será registrado no log de todos os bancos de dados que participaram da transação.

É perfeitamente possível restaurar um backup do banco de dados2 e reproduzir seus logs de transações em um servidor que não possui banco de dados1.

Esse comportamento permite certa flexibilidade na maneira como os procedimentos e exibições são dispostos no SQL Server. Muitos administradores de banco de dados mantêm seus procedimentos armazenados - especialmente os de manutenção - em um banco de dados (por exemplo Admin) completamente separado dos bancos de dados de aplicativos / usuários e gravam os resultados da operação de manutenção nesse banco de dados. Felizmente, é possível restaurar um dos bancos de dados do usuário em um servidor de desenvolvimento sem a necessidade de copiar Admintambém.

Nathan Jolly
fonte