none
Trigger DROP DATABASE

    Pergunta

  • Pessoal alguem consegue me ajudar com uma trigger que salva em uma tabela, qdo ocorre DDL na instance (CREATE DATABASE, ALTER DATABASE, DROP DATABASE)

    ALGO PARECIDO ABAIXO, INSERINDO NA TABELA LOG_ALTER_OBJETO 

    -- CRIAR A TABELA 


    -CREATE TABLE [dbo].[LOG_ALTER_OBJETO](
    [MAQUINA] [sysname] NOT NULL,
    [DADOS] [xml] NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    --CREATE TRIGGER [AUDITORIA_DATABASE]

    ON ALL SERVER
    FOR ALTER_DATABASE
    AS
    INSERT INTO LOG_ALTER_OBJETO VALUES (EVENTDATA())



    segunda-feira, 12 de março de 2018 21:40

Respostas

  • Renata,

    Veja se estes exemplos te ajudam:

    CREATE TRIGGER TI_BLOQUEIA_TABLE
    ON ALL SERVER
    FOR CREATE_TABLE
    AS 
    	if (EXISTS(SELECT 1 FROM sys.sysprocesses where spid > 50 and program_name LIKE '%Microsoft SQL Server Management Studio%' and spid = @@SPID and loginame = 'TESTE'))
    	  BEGIN
    		RAISERROR('VOCÊ NÃO TEM PERMISSÃO PARA EXECUTAR ESTA TAREFA !', 10, 1);
    	  END
    GO
    
    --Faça um teste
    CREATE TABLE TB_TESTE (CAMPO1 INT)
    GO

    CREATE TRIGGER T_DROP_TABLE 
    ON DATABASE 
    FOR DROP_TABLE 
    AS 
    BEGIN 
           PRINT 'Você não possui permissão para esta operação'
           ROLLBACK TRANSACTION
    END
    GO

    Create Table DDL_LogTransacoes
    (TransID Int Identity(1,1) Primary Key,
     DataTransacao DateTime Default GetDate(),
     UsuarioTransacao VarChar(100) Default User_Name(), 
     LoginTransacao Varchar(100) Default Suser_Name(),
     LoginUsuarioSQLTransacao Varchar(100) Default Original_Login(),
     TipoEvento NVarchar(200) Null,
     Objeto NVarchar(200) Null,
     TipoObjeto NVarchar(200) Null,
     Comando_TSQL NVarchar(Max) Null)
    
    Create Trigger Trigger_DDL_LogTransacoes 
    On Database
    For DDL_DATABASE_LEVEL_EVENTS
    As
     Begin
      Set NoCount On
      Declare @DadosXML XML
      
      Set @DadosXML=EVENTDATA()
      
      Insert Into DDL_LogTransacoes(TipoEvento,Objeto,TipoObjeto,Comando_TSQL)
                                    Values(@DadosXML.value('(EVENT_INSTANCE/EventType)[1]','NVarchar(200)') ,
                                               @DadosXML.value('(EVENT_INSTANCE/ObjectName)[1]','NVarchar(200)') ,
    										   @DadosXML.value('(EVENT_INSTANCE/ObjectType)[1]','NVarchar(200)') ,
    										   @DadosXML.value('(EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVarchar(Max)'))
     End  
    
    Create Table Teste
     (Codigo Int,
      Descricao Varchar(100))  
      
    Insert Into Teste Values (1,'Arroz')
    Insert Into Teste Values (2,'Arroz')
    Insert Into Teste Values (3,'Arroz') 
    
    Update Teste
    Set Descricao='Feijão'
    Where Codigo=3
    
    Select * from DDL_LogTransacoes
    
    Select * from sys.event_notification_event_types
    Where TYPE_NAME Like '%Events%'
    


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Sugerido como Resposta Wesley Neves terça-feira, 13 de março de 2018 17:04
    • Marcado como Resposta Renata Cardoso segunda-feira, 26 de março de 2018 20:56
    segunda-feira, 12 de março de 2018 23:07

Todas as Respostas

  • Renata,

    Veja se estes exemplos te ajudam:

    CREATE TRIGGER TI_BLOQUEIA_TABLE
    ON ALL SERVER
    FOR CREATE_TABLE
    AS 
    	if (EXISTS(SELECT 1 FROM sys.sysprocesses where spid > 50 and program_name LIKE '%Microsoft SQL Server Management Studio%' and spid = @@SPID and loginame = 'TESTE'))
    	  BEGIN
    		RAISERROR('VOCÊ NÃO TEM PERMISSÃO PARA EXECUTAR ESTA TAREFA !', 10, 1);
    	  END
    GO
    
    --Faça um teste
    CREATE TABLE TB_TESTE (CAMPO1 INT)
    GO

    CREATE TRIGGER T_DROP_TABLE 
    ON DATABASE 
    FOR DROP_TABLE 
    AS 
    BEGIN 
           PRINT 'Você não possui permissão para esta operação'
           ROLLBACK TRANSACTION
    END
    GO

    Create Table DDL_LogTransacoes
    (TransID Int Identity(1,1) Primary Key,
     DataTransacao DateTime Default GetDate(),
     UsuarioTransacao VarChar(100) Default User_Name(), 
     LoginTransacao Varchar(100) Default Suser_Name(),
     LoginUsuarioSQLTransacao Varchar(100) Default Original_Login(),
     TipoEvento NVarchar(200) Null,
     Objeto NVarchar(200) Null,
     TipoObjeto NVarchar(200) Null,
     Comando_TSQL NVarchar(Max) Null)
    
    Create Trigger Trigger_DDL_LogTransacoes 
    On Database
    For DDL_DATABASE_LEVEL_EVENTS
    As
     Begin
      Set NoCount On
      Declare @DadosXML XML
      
      Set @DadosXML=EVENTDATA()
      
      Insert Into DDL_LogTransacoes(TipoEvento,Objeto,TipoObjeto,Comando_TSQL)
                                    Values(@DadosXML.value('(EVENT_INSTANCE/EventType)[1]','NVarchar(200)') ,
                                               @DadosXML.value('(EVENT_INSTANCE/ObjectName)[1]','NVarchar(200)') ,
    										   @DadosXML.value('(EVENT_INSTANCE/ObjectType)[1]','NVarchar(200)') ,
    										   @DadosXML.value('(EVENT_INSTANCE/TSQLCommand/CommandText)[1]','NVarchar(Max)'))
     End  
    
    Create Table Teste
     (Codigo Int,
      Descricao Varchar(100))  
      
    Insert Into Teste Values (1,'Arroz')
    Insert Into Teste Values (2,'Arroz')
    Insert Into Teste Values (3,'Arroz') 
    
    Update Teste
    Set Descricao='Feijão'
    Where Codigo=3
    
    Select * from DDL_LogTransacoes
    
    Select * from sys.event_notification_event_types
    Where TYPE_NAME Like '%Events%'
    


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Sugerido como Resposta Wesley Neves terça-feira, 13 de março de 2018 17:04
    • Marcado como Resposta Renata Cardoso segunda-feira, 26 de março de 2018 20:56
    segunda-feira, 12 de março de 2018 23:07
  • Eu queria mesmo a nivel de instance e não objeto, pegar quem cria e dropa DATABASES
    quinta-feira, 22 de março de 2018 12:38
  • Renata,

    Neste caso, você terá que criar um Trigger All Server, conforme o meu exemplo apresentado do post anterior.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 22 de março de 2018 18:15