none
DDL Trigger ALL SERVER RRS feed

  • 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)
    quarta-feira, 21 de julho de 2010 12:36

Respostas

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
    quarta-feira, 21 de julho de 2010 12:46
  • 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
    quarta-feira, 21 de julho de 2010 12:50
    Moderador
  • 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.com

    Truncate 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
    quarta-feira, 21 de julho de 2010 12:51
  • Marcelo eu ja tentei efetuar assim, mas ocorre o erro:

    Msg 1098, Level 15, State 1, Procedure safety, Line 6

    The specified event type(s) is/are not valid on the specified target object.

     

     


    Rafael Ferraz Lima
    quarta-feira, 21 de julho de 2010 12:52
  • 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
    quarta-feira, 21 de julho de 2010 12:56
    Moderador
  • 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
    quarta-feira, 21 de julho de 2010 14:20
  • 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
    quarta-feira, 21 de julho de 2010 14:33