Determinando como ocorreu uma alteração no esquema?

21

Algo ruim aconteceu ontem.

Uma visão criada há algum tempo atrás foi modificada por alguém que acabou quebrando os relatórios. Infelizmente. alguém (consciente ou inconscientemente) fez essa modificação no banco de dados PRODUCTION.

Minha pergunta: Existe uma maneira (script / software / freeware etc) pela qual possamos conhecer quem (nome de usuário) fez essa modificação, para que eu possa revogar o acesso ao banco de dados de produção para esse usuário.

Se minha pergunta não estiver clara, comente.

xorpower
fonte

Respostas:

36

Isso é registrado no rastreamento padrão e, desde que esteja ativado e não tenha rolado enquanto isso, ele deve aparecer no relatório "Histórico de alterações de esquema".

Para acessar isso no Management Studio, clique com o botão direito do mouse no banco de dados e, no menu de contexto, escolha Reports -> Standard Reports -> Schema Changes History

Para recuperar as mesmas informações via TSQL, você pode usar

SELECT StartTime
       ,LoginName
       --,f.*
FROM   sys.traces t
       CROSS APPLY fn_trace_gettable(REVERSE(SUBSTRING(REVERSE(t.path),
                                                       CHARINDEX('\', REVERSE(t.path)), 
                                                       260)
                                             ) + N'log.trc', DEFAULT) f
WHERE  t.is_default = 1
       AND ObjectName = 'FOO'
       AND EventClass IN (46, /*Object:Created*/
                          47, /*Object:Dropped*/
                          164 /*Object:Altered*/ )
Martin Smith
fonte
Obrigado Martin, executei a consulta substituindo 'FOO' pela minha visão, mas isso não retornou nada. Alguma idéia de por que isso aconteceu? Eu não executado no servidor, embora
xorpower
1
@Xorpower - editei-o para lidar com o Object:Createdevento e também para que a exibição fosse descartada e criada em vez de alterada. Não sabe o que você quer dizer com não está executando no servidor? É claro que você precisa estar conectado à instância correta, mas não importa de onde a conexão vem, desde que você tenha permissões.
Martin Smith
Graças martin, mas o resultado continua o mesmo
xorpower
1
@Xorpower - O que retorna o seguinte?
Martin Smith
3
@Xorpower - Bem, parece que o rastreamento rolou e você perdeu detalhes de algo com mais de 11 horas. O rastreamento padrão mantém apenas 5 arquivos e exclui os mais antigos. Você pode verificar o sistema de arquivos no servidor, a pasta apenas para verificar se esse é definitivamente o caso. Você pode obter o caminho da pastaSELECT path FROM sys.traces where is_default=1
Martin Smith
19

Martin já apontou para a melhor avenida, o rastreamento de auditoria administrativa que geralmente está ativado (a menos que tenha sido explicitamente desativado). Se você não conseguir encontrar as informações no rastreamento do administrador (foi desativado ou foi reciclado), é possível recuperar as informações dos backups de log. Como é um banco de dados de produção, presumo que você tenha um ciclo de backup regular, com backups periódicos completos de backup e log. Você precisará restaurar, em um servidor separado, o banco de dados por volta da hora do incidente, para que o DDL esteja no log restaurado atual. Então é uma simples questão de usar fn_dblog()e inspecionar o log.

Uma maneira é seguir as operações de início da transação:

select [Begin Time], [Transaction Name], [Transaction SID], * 
from fn_dblog(null, null)
where Operation = 'LOP_BEGIN_XACT';

Se o ALTER VIEWfoi emitido em uma transação independente (ou seja, não é cercado por BEGIN TRANSACTION/ COMMIT), ele iniciará uma transação denominada CreatProc transaction. Procure e [Transaction SID]é o SID de login que você deseja.

Outra possibilidade é procurar a transação que adquiriu um SCH_M na visualização desejada:

select [Lock Information], * 
from fn_dblog(null, null)
where [Lock Information] like '%' + cast(object_id('...') as varchar(10))+'%'
and [Lock Information] like '%LOCK_SCH_M%'
go

Observe que se a exibição foi alterada por DROP seguida por CREATE, o ID do objeto provavelmente foi alterado, mas pelo menos você obterá a transação que fez o último CREATE (o ID do objeto atual da exibição no banco de dados restaurado). Com o ID da transação, você volta e recupera as informações de início da transação:

select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where [Transaction ID] = '...'
and Operation = 'LOP_BEGIN_XACT';

O [Transaction SID] é, novamente, o seu cara. Use SUSER_SNAMEpara recuperar o nome de login do SID de login. Se o SID for 0x01, significa que o login foi sa, o que significa que qualquer pessoa que saiba que a sasenha poderia ter feito isso.

Remus Rusanu
fonte
2
Ótima dica sobre a leitura dos arquivos de log. Isso é útil se alguém desativou os rastreamentos padrão.
StanleyJohns
E se o SID da transação for nulo?
evictednoise
@evictednoise publique os registros de log relevantes (em uma pergunta separada). Pode haver mais de um motivo e os registros de log ajudariam a determinar a causa real.
Remus Rusanu
6

Não, a menos que você o tenha registrado através de um gatilho DDL ou

Você deseja examinar quem, como direitos ALTER nesse banco de dados, ou associação à função sysadmin / db_owner / ddl_admin. Isso seria melhor como uma revisão geral do que como uma caça às bruxas. Provavelmente, há outras pessoas com direitos para fazer alterações não aprovadas e não autorizadas também

gbn
fonte
0

Se ainda não o fez, consulte o relatório Histórico de alterações de esquema disponível no SQL Server Management Studio. Parece que o SQL Server registra alterações por padrão ( rastreamento padrão ) e você deve poder visualizar esses dados por meio deste relatório. A única coisa infeliz é que esses arquivos de rastreio são automaticamente excluídos / rolados com o passar do tempo, para que os dados já tenham desaparecido. Boa sorte!

Mark Madej
fonte
Opa, não importa. Vejo que Martin Smith já fez referência a este relatório em sua resposta. Vou deixar isso aqui, caso algum dos links seja útil.
precisa saber é o seguinte