none
Trigger DDL - Exceção aos jobs RRS feed

  • Pergunta

  • Pessoal, tudo joia?

     

    Implementei uma trigger DDL que vai dar Rollback em todas as transações de DROP TABLE, DROP VIEW e DROP Procedure:

     

    CREATE TRIGGER PreventDropTableViewProcedure
    ON DATABASE
    FOR DROP_TABLE, DROP_VIEW, DROP_PROCEDURE
    AS
    PRINT 'Tabelas, Views e Procedures não podem ser deletadas no ambiente de produção o sem auxílio do DBA'
    ROLLBACK
    

    Porém tem um job que roda diariamente, criando e dropando tabelas de histórico para mover os dados da tabela ONLINE para uma OFFLINE, e essa trigger está fazendo o JOB pagar.

     

    A dúvida é , tem como colocar no contexto de execução do JOB algo para ignorar a trigger?

    segunda-feira, 7 de novembro de 2011 16:58

Respostas

  • Bom Dia,

    Toda trigger DDL retorna informações através da função EVENTDATA. Você pode utilizá-la para consultar várias informações como banco, login utilizado, etc. Se com essas informações for possível identificar se é ou não um JOB e aí você pode decidir. Ex:

    SELECT EVENTDATA().value('/EVENT_INSTANCE/LoginName','NVARCHAR(100)') As Usuario

    Esse código retorna o login que efetuou a ação no momento em que a trigger foi disparada. Você pode usar o SPID também e fazer um JOIN com a sys.dm_exec_sessions para descobrir a aplicação. Ex:

    select program_name, host_name, login_name, context_info from sys.dm_exec_sessions
    where session_id = (
     SELECT EVENTDATA().value('/EVENT_INSTANCE/SPID','SMALLINT'))

    Com base nessas informações é só montar os IFs.

    Triggers DDL são um recurso poderoso, mas sem o uso da EVENTDATA(), seu poder fica muito limitado.

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 8 de novembro de 2011 11:46

Todas as Respostas

  • Leonardo,

     

    Veja minha resposta nesta thread, creio que possa ser uma solução.

    http://social.technet.microsoft.com/Forums/pt-BR/520/thread/7b5d6107-ba62-4272-8c61-b063135235ec

     

    Lembrando que o IF, deve estar em sua triiger, e o set context info, na sua procedure, ou ao menos no script que roda diariamente ai as tabelas....


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    segunda-feira, 7 de novembro de 2011 17:07
    Moderador
  • Bom Dia,

    Toda trigger DDL retorna informações através da função EVENTDATA. Você pode utilizá-la para consultar várias informações como banco, login utilizado, etc. Se com essas informações for possível identificar se é ou não um JOB e aí você pode decidir. Ex:

    SELECT EVENTDATA().value('/EVENT_INSTANCE/LoginName','NVARCHAR(100)') As Usuario

    Esse código retorna o login que efetuou a ação no momento em que a trigger foi disparada. Você pode usar o SPID também e fazer um JOIN com a sys.dm_exec_sessions para descobrir a aplicação. Ex:

    select program_name, host_name, login_name, context_info from sys.dm_exec_sessions
    where session_id = (
     SELECT EVENTDATA().value('/EVENT_INSTANCE/SPID','SMALLINT'))

    Com base nessas informações é só montar os IFs.

    Triggers DDL são um recurso poderoso, mas sem o uso da EVENTDATA(), seu poder fica muito limitado.

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 8 de novembro de 2011 11:46
  • O EVENTDATA realmente é muito bom, vou implementar as triggers aqui dessa maneira e ver o resultado.

     

    Obrigado a todos.

    quarta-feira, 9 de novembro de 2011 12:56