none
Trigger para identificar a criação de uma tabela RRS feed

  • Pergunta

  • Pessoal

         Qual seria a melhor maneira de eu identificar a criação de uma tabela dentro do SQL Server, existiria alguma trigger que posso criar para identificar o momento que houve está criação ou algo semelhante a isto ?

    sexta-feira, 3 de janeiro de 2020 11:28

Respostas

  • Deleted
    • Marcado como Resposta neibala terça-feira, 7 de janeiro de 2020 18:49
    sexta-feira, 3 de janeiro de 2020 11:53
  • Neibala,

    Gostaria de compartilhar dois outros exemplos de utilização de Trigger DDL, que apresentei em conjunto com meu amigo Dirceu Resende em nossa palestra sobre Auditoria e Segurança realizada em 2019 no MVPConf Latam.

    Este exemplo demonstra como bloquear criação de tabelas com alguns determinados nomes:

    -- Exemplo 1 -- CREATE TRIGGER [TG_AUDITORIA] ON DATABASE FOR DDL_DATABASE_LEVEL_EVENTS AS

    SET NOCOUNT ON
    DECLARE @data XML
    DECLARE @MSG VARCHAR(300)

    BEGIN SELECT @data = EVENTDATA() SET @MSG = 'REGRA TG_ACESSO - NÃO É PERMITIDO CRIAR A TABELA COM ESTA NOMECLATURA.'

    IF (@data.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(500)') = 'CREATE_TABLE' AND @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(500)') NOT LIKE '%tabela%') BEGIN RAISERROR (@MSG, 16, 1) ROLLBACK END END GO -- Exemplo 2 -- USE Auditoria GO Create TRIGGER tgDMLOnCreateUpdateTable ON DATABASE FOR CREATE_TABLE, ALTER_TABLE AS BEGIN DECLARE @NomesNaoPermitidos AS TABLE (nome VARCHAR(128)); DECLARE @ObjectName VARCHAR(128); INSERT INTO @NomesNaoPermitidos (nome) VALUES ('Temp' -- nome - varchar(128)); SELECT @ObjectName = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(128)'); IF (EXISTS ( SELECT 1 FROM @NomesNaoPermitidos AS NNP WHERE NNP.nome = @ObjectName)) BEGIN RAISERROR('Nome da tabela não permitido',16,1); ROLLBACK; END; ELSE SELECT @ObjectName; END
    Go


    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]




    sexta-feira, 3 de janeiro de 2020 15:32

Todas as Respostas

  • Deleted
    • Marcado como Resposta neibala terça-feira, 7 de janeiro de 2020 18:49
    sexta-feira, 3 de janeiro de 2020 11:53
  • Neibala,

    Se você simplesmente quiser saber a data de criação da tabela, você pode olhar pela sys.tables, campo Create_Date.

    SELECT * FROM Sys.tables
    WHERE NAME = 'MINHATABELA'

    Agora, se você precisar de mais informações como quem criou essa tabela (qual usuário), aí terá que partir para triggers de auditoria.

    Abaixo está um link de um artigo do Dirceu Resende, muito bem explicado e tranquilo de reproduzir.

    https://www.dirceuresende.com/blog/como-criar-uma-trigger-de-auditoria-para-logar-a-manipulacao-de-objetos-no-sql-server/

    Espero ter ajudado.


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    sexta-feira, 3 de janeiro de 2020 12:16
  • Uma opção também é utilizar eventos estendidos para monitorar.

    Fabiano Carvalho

    sexta-feira, 3 de janeiro de 2020 12:44
  • O problema do Extended Events é que você teria que deixar ligado tipo "pra sempre" até pegar o dado que quer.

    As triggers DDL são uma excelente opção porque só são disparadas no caso de algum CREATE/ALTER/DROP.

    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    sexta-feira, 3 de janeiro de 2020 12:49
  • Neibala,

    Gostaria de compartilhar dois outros exemplos de utilização de Trigger DDL, que apresentei em conjunto com meu amigo Dirceu Resende em nossa palestra sobre Auditoria e Segurança realizada em 2019 no MVPConf Latam.

    Este exemplo demonstra como bloquear criação de tabelas com alguns determinados nomes:

    -- Exemplo 1 -- CREATE TRIGGER [TG_AUDITORIA] ON DATABASE FOR DDL_DATABASE_LEVEL_EVENTS AS

    SET NOCOUNT ON
    DECLARE @data XML
    DECLARE @MSG VARCHAR(300)

    BEGIN SELECT @data = EVENTDATA() SET @MSG = 'REGRA TG_ACESSO - NÃO É PERMITIDO CRIAR A TABELA COM ESTA NOMECLATURA.'

    IF (@data.value('(/EVENT_INSTANCE/EventType)[1]', 'varchar(500)') = 'CREATE_TABLE' AND @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(500)') NOT LIKE '%tabela%') BEGIN RAISERROR (@MSG, 16, 1) ROLLBACK END END GO -- Exemplo 2 -- USE Auditoria GO Create TRIGGER tgDMLOnCreateUpdateTable ON DATABASE FOR CREATE_TABLE, ALTER_TABLE AS BEGIN DECLARE @NomesNaoPermitidos AS TABLE (nome VARCHAR(128)); DECLARE @ObjectName VARCHAR(128); INSERT INTO @NomesNaoPermitidos (nome) VALUES ('Temp' -- nome - varchar(128)); SELECT @ObjectName = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(128)'); IF (EXISTS ( SELECT 1 FROM @NomesNaoPermitidos AS NNP WHERE NNP.nome = @ObjectName)) BEGIN RAISERROR('Nome da tabela não permitido',16,1); ROLLBACK; END; ELSE SELECT @ObjectName; END
    Go


    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]




    sexta-feira, 3 de janeiro de 2020 15:32
  • Junior Galvão

        No caso do exemplo 2 ele funciona sem mesmo eu ativar a auditoria de banco de dados, pois me ajudou em muito, pois das informações que precisa e que seria necessário, o nome do usuário e identificar o nome da tabela e da forma que observei no seu exemplo e estou montando, onde consegui até o momento, então quero agradecer desde já toda a atenção.

    terça-feira, 7 de janeiro de 2020 18:49
  • Junior Galvão

        No caso do exemplo 2 ele funciona sem mesmo eu ativar a auditoria de banco de dados, pois me ajudou em muito, pois das informações que precisa e que seria necessário, o nome do usuário e identificar o nome da tabela e da forma que observei no seu exemplo e estou montando, onde consegui até o momento, então quero agradecer desde já toda a atenção.

    Neibala,

    Ótimo.


    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]

    terça-feira, 7 de janeiro de 2020 19:01