none
Como identificar o nome do usuário que criou uma tabela RRS feed

  • Pergunta

  • Pessoal

           Como eu faria para identificar o nome do usuário que criou uma determinada tabela dentro do banco de dados, existia uma dmv ou algo similar a isto, onde no momento estou utilizando o SQL Server 2014 ?

    terça-feira, 22 de outubro de 2019 20:10

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
    quarta-feira, 23 de outubro de 2019 14:23

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'



    terça-feira, 22 de outubro de 2019 20:37
  • 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 ?

    quarta-feira, 23 de outubro de 2019 14:19
  • 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
    quarta-feira, 23 de outubro de 2019 14:23
  • 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]

    quarta-feira, 23 de outubro de 2019 23:24
  •    Junior Galvão

         A forma da qual você me enviou, não consegui identificar o nome do usuário ?


    • Editado neibala terça-feira, 29 de outubro de 2019 11:36 Erro na digitação, troca do assunto.
    terça-feira, 29 de outubro de 2019 11:31
  • André

          A forma que você me enviou atente a minha necessidade, valeu mesmo.

    terça-feira, 29 de outubro de 2019 11:34
  •    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.
    terça-feira, 29 de outubro de 2019 11:50