Usuário com melhor resposta
Como identificar o nome do usuário que criou uma tabela

Pergunta
-
Respostas
-
DBCC TRACESTATUS
Mas o trace que foi habilitado no teste acima não está relacionado com auditorias, apenas permite ler a porção inativa do transaction log.
O ideal, é ter uma auditoria habilitada (DDL Trigger, CDC, etc), pois nem sempre é possível recuperar informações pelo transaction log.- Editado André Renato Furtado quarta-feira, 23 de outubro de 2019 14:25
- Marcado como Resposta neibala terça-feira, 29 de outubro de 2019 11:34
Todas as Respostas
-
SQL Server somente memoriza essa informação através de auditoria, seja Trigger DDL ou pelo relatório Schema Changes History.
Pelo transaction log é possível recuperar o usuário que rodou o CREATE TABLE, mas depende se esta transação ainda está em disco.
Ex: aqui não prevê se a transação foi efetivada (comitada) ou não, e busca pela criação da tabela tabela_teste:
DBCC TRACEON(2537) SELECT SUSER_SNAME(fn1.[Transaction SID]) AS Usuario_que_criou FROM fn_dblog(NULL, NULL) fn1 INNER JOIN ( SELECT [Transaction ID], [RowLog Contents 0] FROM fn_dblog(NULL, NULL) WHERE Operation = 'LOP_INSERT_ROWS' AND Context = 'LCX_CLUSTERED' AND AllocUnitName = 'sys.sysschobjs.clst' AND CAST([RowLog Contents 0] AS NVARCHAR(MAX)) LIKE '%tabela_teste%' ) fn2 ON ( fn1.[Transaction ID] = fn2.[Transaction ID] ) WHERE fn1.[Transaction Name] = 'CREATE TABLE' OR fn1.[Transaction Name] = 'user_transaction'
- Sugerido como Resposta IgorFKModerator quarta-feira, 23 de outubro de 2019 14:09
- Editado André Renato Furtado quarta-feira, 23 de outubro de 2019 15:47
-
André Renato
Legal o seu script principalmente da forma que está, onde vou fazer mais alguns testes aqui, agora na questão que você habilitou o trace, como eu saberia que um trace está ativo ou não, isto antes de ativar ou outra maneira de identificar os trace ativos no momento, tem como ?
-
DBCC TRACESTATUS
Mas o trace que foi habilitado no teste acima não está relacionado com auditorias, apenas permite ler a porção inativa do transaction log.
O ideal, é ter uma auditoria habilitada (DDL Trigger, CDC, etc), pois nem sempre é possível recuperar informações pelo transaction log.- Editado André Renato Furtado quarta-feira, 23 de outubro de 2019 14:25
- Marcado como Resposta neibala terça-feira, 29 de outubro de 2019 11:34
-
Neibala,
Acredito que este exemplo que utilizar as mais tradicionais visões de sistema existentes no SQL Server poderá te ajudar:
select so.name, su.name, so.crdate from sysobjects so inner join sysusers su on so.uid = su.uid Order By so.crdate
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
-
Junior Galvão
A forma da qual você me enviou, não consegui identificar o nome do usuário ?
Neibala,
A sugestão do André é legal, mas eu não acho interessante ficar acessando o log de eventos do SQL Server, por isso tentei propor algo mais simples, mas talvez não tenha lhe atendido. A coluna su.name esta retornando o que para você?
Veja este outro exemplo que faz uso da FN_Trace_GetInfo e FN_Trace_GetTable:
DECLARE @CaminhoLog Nvarchar(2000) SELECT @CaminhoLog = convert(Nvarchar(max),value) from ::fn_trace_getinfo(0) where property = 2 -- Identificando os eventos de criação e exclusão de tabelas -- SELECT SPID, LoginName, NTUserName, NTDomainName, HostName, ApplicationName, StartTime, ServerName, DatabaseName, CASE EventClass WHEN 46 THEN 'CREATE' WHEN 47 THEN 'DROP' ELSE 'OTHER' END AS EventClass, CASE ObjectType WHEN 8277 THEN 'User defined Table' ELSE 'OTHER' END AS ObjectType, ObjectID, ObjectName FROM fn_trace_gettable (@CaminhoLog, Default) Where EventSubClass = 1 /* Evento comitado */ And ObjectType = 8277 -- Id relacionado a eventos de tabela ORDER BY StartTime GO
Através do uso da FN_Trace_GetTable temos a capacidade de obter informações do que foi registrado nos arquivos de trace criados pelo SQL Server, sem ter a necessidade de fazer acesso direto ao arquivo de log do SQL Server, o que acaba sendo mais simples e menos impactante, além disso, os níveis de permissão para acessar os trace file são menores.
Outro detalhe importante, ao utilizar a FN_Trace_GetTable não necessitamos fazer uso das trace flags.
Você pode combiner o uso desta FN_Trace, com as outras:
sys.fn_trace_getinfo (Transact-SQL)
sys.fn_trace_getfilterinfo (Transact-SQL)sys.fn_trace_geteventinfo (Transact-SQL)
Espero que este exemplo te ajude.
------------------------------------------------------------------------------
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
- Editado Junior Galvão - MVPMVP terça-feira, 29 de outubro de 2019 12:41 Atualização do conteúdo da postagem.