Usuário com melhor resposta
Trigger para identificar a criação de uma tabela

Pergunta
-
Respostas
-
-
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]
- Editado Junior Galvão - MVPMVP sexta-feira, 3 de janeiro de 2020 15:35
- Marcado como Resposta neibala terça-feira, 7 de janeiro de 2020 18:49
Todas as Respostas
-
-
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.Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */
-
-
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 */
-
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]
- Editado Junior Galvão - MVPMVP sexta-feira, 3 de janeiro de 2020 15:35
- Marcado como Resposta neibala 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.
-
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]