Não consigo entender por que essa junção não está funcionando para retornar o nome da tabela ao consultar o arquivo de log de transações.
SELECT [Transaction ID],
[Current LSN],
PartitionId,
sp.object_id,
so.[name],
[Operation],
[Context],
[AllocUnitName],
[Begin Time],
[End Time],
[Transaction SID],
[Num Elements] ,
[RowLog Contents 0],
[RowLog Contents 1],
[RowLog Contents 2],
[RowLog Contents 3]
FROM fn_dump_dblog(NULL,NULL,'DISK',1
,'D:\Users\Chad\SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Backup\OTIS_LogBackup_2016-02-02_13-36-21.bak'
,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
,NULL,NULL,NULL,NULL) as logF
LEFT OUTER JOIN sys.partitions sp ON sp.partition_id = logF.PartitionId
LEFT OUTER JOIN sys.objects so on so.object_id = sp.object_id
WHERE
[Transaction ID] = '0000:00d15747';
E aqui estão os resultados. Você pode ver que o ID da partição está preenchido:
E quando executo esta consulta para obter o nome da tabela, ela funciona usando esse ID de partição encontrado nos resultados anteriores:
SELECT so.*
FROM sys.objects so
INNER JOIN sys.partitions sp on so.object_id = sp.object_id
WHERE sp.partition_id = 72057594059489280
Então, por que ele não consegue encontrar o nome da tabela quando eu entro na instrução original acima?
Você precisa garantir que está executando a consulta no contexto do banco de dados correto.
Como as exibições do sistema
sys.objects
são sensíveis ao contexto, elas retornam apenas linhas relacionadas ao banco de dados atual.Por exemplo, executar este código no mestre mostraria apenas as tabelas onde
PartitionId
existe no mestre, e esses nomes de tabela provavelmente estariam incorretos.Supondo que o nome do seu banco de dados seja
OTIS
, você pode contornar isso adicionando o nome do banco de dados à sua cláusula de junção, comoJOIN OTIS.sys.partitions
eJOIN OTIS.sys.objects
.Como você codificou o nome do próprio arquivo de log, algo assim deve funcionar de maneira mais confiável:
Como alternativa, você pode simplesmente colocar
USE OTIS;
antes de suaselect
instrução, para que seja executada primeiro.