Usuário com melhor resposta
DDL Trigger ALL SERVER

Pergunta
-
Bom dia.
Estou precisando implementar uma trigger para previnir alterações nas estruturas das tabelas.
Eu tenho vários bancos de dados eu sei como fazer para cada um.CREATE
TRIGGER safety
ON database
FOR DROP_TABLE, ALTER_TABLE
AS
PRINT 'Favor entrar em contato com o DBA'
ROLLBACK ;É possível fazer uma única trigger para todos os bancos?
Rafael Ferraz Lima- Movido Gustavo Maia Aguiar quarta-feira, 21 de julho de 2010 12:51 (De:SQL Server - Desenvolvimento Geral)
Respostas
-
Rafael, essa tem que ser banco por banco, não tem jeito, é o escopo do Drop e Alter Table.
Esse link: http://technet.microsoft.com/en-us/library/ms191441(SQL.90).aspx
Tem a lista com os escopos.
Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco- Sugerido como Resposta Gustavo Maia Aguiar quarta-feira, 21 de julho de 2010 12:51
- Marcado como Resposta Rafael Ferraz Lima quarta-feira, 21 de julho de 2010 12:59
-
Bom Dia,
Como relatado, os eventos de ALTER TABLE e DROP TABLE tem escopo de banco e não podem fazer parte de uma trigger com escopo ALL SERVER. Se a idéia é impedir, você terá que criar uma trigger para cada banco de dados. Se a idéia é logar, você pode utilizar a notificação de eventos com os eventos ALTER OBJECT, DROP OBJECT. As notificações de eventos (Event Notification) são mais poderosas que as DDLs Triggers em quantidade de eventos, mas não tem a capacidade de reagir de forma síncrona e não podem por exemplo impedir o evento.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.comTruncate versus Delete - Uma explicação mais detalhada
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!1112.entry
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Gustavo Maia Aguiar quarta-feira, 21 de julho de 2010 12:51
- Marcado como Resposta Rafael Ferraz Lima quarta-feira, 21 de julho de 2010 12:58
Todas as Respostas
-
Rafael, essa tem que ser banco por banco, não tem jeito, é o escopo do Drop e Alter Table.
Esse link: http://technet.microsoft.com/en-us/library/ms191441(SQL.90).aspx
Tem a lista com os escopos.
Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco- Sugerido como Resposta Gustavo Maia Aguiar quarta-feira, 21 de julho de 2010 12:51
- Marcado como Resposta Rafael Ferraz Lima quarta-feira, 21 de julho de 2010 12:59
-
Rafael,
acessos (insert, select e updates) e um role para acessos administrativos que centralizaria no DBA ou uma pessoa autorizada a fazer estas alteracoes
att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba- Editado Marcelo Fernandes da SilvaMVP, Moderator quarta-feira, 21 de julho de 2010 12:54
-
Bom Dia,
Como relatado, os eventos de ALTER TABLE e DROP TABLE tem escopo de banco e não podem fazer parte de uma trigger com escopo ALL SERVER. Se a idéia é impedir, você terá que criar uma trigger para cada banco de dados. Se a idéia é logar, você pode utilizar a notificação de eventos com os eventos ALTER OBJECT, DROP OBJECT. As notificações de eventos (Event Notification) são mais poderosas que as DDLs Triggers em quantidade de eventos, mas não tem a capacidade de reagir de forma síncrona e não podem por exemplo impedir o evento.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.comTruncate versus Delete - Uma explicação mais detalhada
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!1112.entry
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Gustavo Maia Aguiar quarta-feira, 21 de julho de 2010 12:51
- Marcado como Resposta Rafael Ferraz Lima quarta-feira, 21 de julho de 2010 12:58
-
-
Rafael, nao me atentei que o escopo do envet era por database... ja eliminei o meu script
se te ajuda, talvez vc possa usar a proc nao documentada sp_msforeachdb para criar esta trigger para todos os DBs
att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba -
Marcelo eu tentei executar a sp_msforeachdb mas deu erro. Ele tentou tudo no mesmo banco
e se eu colocar tudo no mesmo comando da erro dizendo que o create trigger tem que vim em primeiro lugar...
exec
sp_msforeachdb @command1= '
use ?'
, @command2 ='
CREATE TRIGGER tr_safety
ON database
FOR DROP_TABLE, ALTER_TABLE, CREATE_TABLE, CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE
AS
PRINT ''Favor entrar em contato com o DBA.''
--SELECT EVENTDATA()
DECLARE @data XML
SET @data = EVENTDATA()
ROLLBACK
INSERT INTO dblog.dbo.LogDDL
( DadosXML, banco )
VALUES ( @data, -- DadosXML - xml
db_name()
)
'
Erro:
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Msg 2714, Level 16, State 2, Procedure tr_safety, Line 12
There is already an object named 'tr_safety' in the database.
Rafael Ferraz Lima -
Rafael, tente assim:
sp_msforeachdb 'use ? ;
CREATE TRIGGER tr_safety
ON database
FOR DROP_TABLE, ALTER_TABLE, CREATE_TABLE, CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE
AS
PRINT ''Favor entrar em contato com o DBA.''
--SELECT EVENTDATA()
DECLARE @data XML
SET @data = EVENTDATA()
ROLLBACK
INSERT INTO dblog.dbo.LogDDL ( DadosXML, banco )
VALUES ( @data, -- DadosXML - xml
db_name())'
Tks. Fausto Fiorese Branco MCTS, MCITP/DBA 2005 | MCITP/DBA 2008 São Paulo - Brasil * http://www.linkedin.com/in/faustobranco