none
Trigger de Database RRS feed

Respostas

  • Tráfego,

    Sim o Trigger de DDL é justamente uma possível solução para se trabalhar com Trigger para Eventos de Bancos de Dados, mas alguns cuidados devem ser tomados para evitarmos impactos no acesso aos bancos de dados.

    Veja abaixo um exemplo:

    USE DBSUPSQL;
    GO
     
    ----====================================================================
    --- ESCOPO DE CRIACAO DE TABELA , PK , INDICE ( NONCLUSTERED) 
    ----====================================================================
    If Object_Id ('Auditoria_Logon') Is Not Null
     Drop Table Auditoria_Logon ;
    Go
    Create Table dbo.Auditoria_Logon
     (  id_Auditoria_Logon  Int Identity (1,1),
        [Login]        Varchar(100)           , 
        Data_Login     SmallDatetime          ,
        Usuario        Varchar(100)           , 
        Aplicacao      Varchar(100)           , 
        [Host]         Varchar(100)           , 
        [DataBase]     Varchar(100)           , 
        Evento         Varchar(Max))
    Go 
    Alter Table Auditoria_Logon Add Constraint Pk_Auditoria_Logon  Primary Key (id_Auditoria_Logon)
    Go
    Create NonClustered Index ID_01 On Auditoria_Logon ([Login], Data_Login ) With FillFactor = 80 
    Go 
    ----====================================================================
    --- TRIGGER DE LOGON 
    ----====================================================================
    If Object_Id ('trg_Auditoria_LOgin') Is Not Null
     Drop  trg_Auditoria_LOgin ;
    Go
    CREATE TRIGGER trg_Auditoria_LOgin
              ON ALL SERVER FOR LOGON -- With Execute as 'sa'
              AS
    BEGIN
             
    Insert Into Auditoria_Logon ( Login,Data_Login,Usuario,Aplicacao,[Host],[DataBase],Evento ) 
      Select Login        = ORIGINAL_LOGIN()  , 
             Data_Login   = Getdate()         , 
             Usuario      = USER_NAME()       , 
             Aplicacao    = APP_NAME()        , 
             Host         = HOST_NAME()       , 
             [DataBase]   = DB_NAME()         ,
             Evento       = Convert(Varchar(max),EVENTDATA())
    ----========================================================================
    --- ESSE FILTRO DEPENDE DA NOSSA NECESSIDADE LOGAR UMA VEZ AO DIA OU LOGAR 
    --- TODA VEZ QUE ABRIR UMA SESSAO COM SQL SERVER ?
    ----=======================================================================
     Where Not Exists  ( Select * 
                            From Auditoria_Logon aa
                           Where Usuario = USER_NAME()
                             And Convert(Varchar(10), Data_Login ,113) = Convert(Varchar(10), Getdate()  ,113))
            
       END;
     
     


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Giovani Cr segunda-feira, 2 de dezembro de 2013 12:32
    sexta-feira, 29 de novembro de 2013 21:28

Todas as Respostas

  • Deleted
    sexta-feira, 22 de novembro de 2013 16:02
  • CREATE TRIGGER nome_do_gatilho ON Nome_da_Tabela AFTER INSERT, UPDATE AS

    --to do (comando a realizar)

    ;

    sexta-feira, 22 de novembro de 2013 18:33
  • Douglas,

    Na verdade você esta se referindo a Triggers do tipo DML, o SQL Server também trabalhar com Triggers no Nível de Banco de Dados, mas a forma de uso é outra.

    Veja se estes exemplos podem te ajudar:

    Create Table NovosProdutos
     (Codigo Int Identity(1,1),
       Descricao VarChar(20),
       Saldo Int)
    Go
    Insert Into NovosProdutos Values('Produto -'+Convert(VarChar(3),@@Identity),0)
    Go 100
    Create Table Movimentacao
     (Codigo Int Identity(1,1),
       CodProduto Int,
       TipoMovimentacao Char(1),
       Valor Int)
    Go
    Create Trigger T_MovimentacaoSaldo
    On Movimentacao
    After Insert, Update
    As
     Declare @TipoMovimentacao Char(1)
     Select @TipoMovimentacao=TipoMovimentacao from Inserted
     If @TipoMovimentacao = 'E'
      Begin
       Update NovosProdutos
       Set Saldo = Saldo + I.Valor
       from NovosProdutos NP Inner Join Inserted I
                                          On NP.Codigo = I.CodProduto  
      End
      If @TipoMovimentacao = 'S'
      Begin
       Update NovosProdutos
       Set Saldo = Saldo - I.Valor
       from NovosProdutos NP Inner Join Inserted I
                                          On NP.Codigo = I.CodProduto
      End
    --Fazendo lançamentos de entrada
    Insert Into Movimentacao Values(2,'E',10)
    Insert Into Movimentacao Values(2,'E',15)
    Insert Into Movimentacao Values(2,'E',5)
    Insert Into Movimentacao Values(2,'E',22)
    Insert Into Movimentacao Values(2,'E',10)
    --Fazendo lançamentos de saída
    Insert Into Movimentacao Values(2,'S',8)
    Insert Into Movimentacao Values(2,'S',5)
    Insert Into Movimentacao Values(2,'S',3)
    Insert Into Movimentacao Values(2,'S',2)
    Insert Into Movimentacao Values(2,'S',1)
    Insert Into Movimentacao Values(8,'E',10)
    Insert Into Movimentacao Values(9,'E',15)
    Insert Into Movimentacao Values(1,'E',5)
    Insert Into Movimentacao Values(3,'E',22)
    Insert Into Movimentacao Values(22,'E',10)
    --Fazendo lançamentos de saída
    Insert Into Movimentacao Values(8,'S',8)
    Insert Into Movimentacao Values(9,'S',5)
    Insert Into Movimentacao Values(1,'S',3)
    Insert Into Movimentacao Values(3,'S',2)
    Insert Into Movimentacao Values(22,'S',1)
    Select * from NovosProdutos


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 22 de novembro de 2013 22:59
  • Olá caros. 

    Acabei encontrando. é chamado trigger de DLL. Veja: http://technet.microsoft.com/en-us/library/ms190989(v=sql.105).aspx

    segunda-feira, 25 de novembro de 2013 10:02
  • Tráfego,

    Sim o Trigger de DDL é justamente uma possível solução para se trabalhar com Trigger para Eventos de Bancos de Dados, mas alguns cuidados devem ser tomados para evitarmos impactos no acesso aos bancos de dados.

    Veja abaixo um exemplo:

    USE DBSUPSQL;
    GO
     
    ----====================================================================
    --- ESCOPO DE CRIACAO DE TABELA , PK , INDICE ( NONCLUSTERED) 
    ----====================================================================
    If Object_Id ('Auditoria_Logon') Is Not Null
     Drop Table Auditoria_Logon ;
    Go
    Create Table dbo.Auditoria_Logon
     (  id_Auditoria_Logon  Int Identity (1,1),
        [Login]        Varchar(100)           , 
        Data_Login     SmallDatetime          ,
        Usuario        Varchar(100)           , 
        Aplicacao      Varchar(100)           , 
        [Host]         Varchar(100)           , 
        [DataBase]     Varchar(100)           , 
        Evento         Varchar(Max))
    Go 
    Alter Table Auditoria_Logon Add Constraint Pk_Auditoria_Logon  Primary Key (id_Auditoria_Logon)
    Go
    Create NonClustered Index ID_01 On Auditoria_Logon ([Login], Data_Login ) With FillFactor = 80 
    Go 
    ----====================================================================
    --- TRIGGER DE LOGON 
    ----====================================================================
    If Object_Id ('trg_Auditoria_LOgin') Is Not Null
     Drop  trg_Auditoria_LOgin ;
    Go
    CREATE TRIGGER trg_Auditoria_LOgin
              ON ALL SERVER FOR LOGON -- With Execute as 'sa'
              AS
    BEGIN
             
    Insert Into Auditoria_Logon ( Login,Data_Login,Usuario,Aplicacao,[Host],[DataBase],Evento ) 
      Select Login        = ORIGINAL_LOGIN()  , 
             Data_Login   = Getdate()         , 
             Usuario      = USER_NAME()       , 
             Aplicacao    = APP_NAME()        , 
             Host         = HOST_NAME()       , 
             [DataBase]   = DB_NAME()         ,
             Evento       = Convert(Varchar(max),EVENTDATA())
    ----========================================================================
    --- ESSE FILTRO DEPENDE DA NOSSA NECESSIDADE LOGAR UMA VEZ AO DIA OU LOGAR 
    --- TODA VEZ QUE ABRIR UMA SESSAO COM SQL SERVER ?
    ----=======================================================================
     Where Not Exists  ( Select * 
                            From Auditoria_Logon aa
                           Where Usuario = USER_NAME()
                             And Convert(Varchar(10), Data_Login ,113) = Convert(Varchar(10), Getdate()  ,113))
            
       END;
     
     


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Giovani Cr segunda-feira, 2 de dezembro de 2013 12:32
    sexta-feira, 29 de novembro de 2013 21:28
  • A minha necessidade é bem específica.

    Preciso impedir que seja anexado(attach) um database, ou seja ao tentar anexar, a trigger deverá disparar um log e cancelar o attach.

    att.

    segunda-feira, 2 de dezembro de 2013 16:03
  • Olá Rodrigo,

    Voce pode criar uma trigger para ser disparada antes do comando sofrer o commit e fazer com que a trigger the roll back na situação que você não quer que aconteça. Algo do tipo:

    create trigger dbo.something after insert as
    begin
        if exists ( select * from inserted where sum(credits) > 30 )
        begin
            rollback transaction
            raiserror ('some message', 16, 1)
        end
    end

    Espero ter ajudado. Caso sim classifique a resposta como útil por favor.

    Justo Daniel

    MCTS/MCDST/MCP

    segunda-feira, 2 de dezembro de 2013 16:49
  • Olá Justo.

    o problema é que preciso fazer isso ao anexar(attach) um database. e não ao inserir um registro.

    Caso tenha alguma ideia será bem vinda!

    Obrigado!

    segunda-feira, 2 de dezembro de 2013 16:57
  • M. Rodrigo,

    Exatamento o que você precisa fazer quando uma nova base é attachada? Dependendo do que for o que poderia te ajudar seria o Policy Management de uma olhada e veja se lhe ajuda:

    http://technet.microsoft.com/en-us/library/bb510667(v=sql.105).aspx

    att,

    Justo Daniel

    MCTS/MCDST/MCP

    terça-feira, 3 de dezembro de 2013 19:02
  • Olá, No books online você encontra todos os eventos monitorados pelas Triggers de DDL. Procure no tópico DDL Triggers, subtópico event groups. Veja se o exemplo abaixo ajuda você.
    create TRIGGER [ddltrg_CREATE_DATABASE] 
    ON ALL SERVER 
    FOR CREATE_DATABASE 
    AS 
        rollback 
        PRINT 'Database Não pode Ser Criada neste momento. Procure o departamento de TI.'
    
    GO
    
    ENABLE TRIGGER [ddltrg_CREATE_DATABASE] ON ALL SERVER
    GO
    


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    quarta-feira, 4 de dezembro de 2013 03:36
    Moderador
  • Olá Roberto.

    Já usei diversos eventos, inclusive um grupo de evento também de nível de servidor "DDL_SERVER_LEVEL_EVENTS" a Trigger é disparada e mensagem aparece porem ele anexa o database. O objetivo é que a trigger impeça que o database seja Anexado(attach).

    executei sua trigger e o resultado foi:

    ------------------------------
    ADDITIONAL INFORMATION:
    An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)
    ------------------------------
    A transação foi encerrada no gatilho. O lote foi anulado.
    Database Não pode Ser Criada neste momento. Procure o departamento de TI. (Microsoft SQL Server, Error: 3609)
    ------------------------------
    BUTTONS:
    OK
    ------------------------------

    Porem o Database foi Anexado.

    Caso tenha alguma outra ideia, será bem vinda.

    Obrigado!

    quarta-feira, 4 de dezembro de 2013 11:12