Usuário com melhor resposta
Trigger DDL - Exceção aos jobs

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?
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- Sugerido como Resposta Gustavo Maia Aguiar terça-feira, 8 de novembro de 2011 11:46
- Marcado como Resposta Leonardo Pedroso Costa quarta-feira, 9 de novembro de 2011 12:54
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- Editado Fabrizzio CaputoModerator segunda-feira, 7 de novembro de 2011 17:07
-
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- Sugerido como Resposta Gustavo Maia Aguiar terça-feira, 8 de novembro de 2011 11:46
- Marcado como Resposta Leonardo Pedroso Costa quarta-feira, 9 de novembro de 2011 12:54
-