[firebase-br] SP teórica para habilitar/desabilitar todos os triggers de um banco

Escovador de Bits escovadordebits em gmail.com
Qua Maio 20 03:28:30 -03 2009


Bom dia/tarde Evandro.

Grande Evandro, você já utilizou o comando EXECUTE STATEMENT?

Com ele, você pode gerar dinamicamente qualquer comando SQL em uma 
variável string (VARCHAR) e executar o seu conteúdo.

Que tal aproveitar o seu código? Vamos lá:

Coloquei os comentários sem acentuação porque o FlameRobin de Linux não 
exibe o código fonte de stored procedures e nem de triggers que 
contenham acentuação.

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SP_DATABASE_TRIGGERS(
  -- Informa se devemos ativar ('A') ou desativar ('D') todas as triggers das tabelas de usuario.
  COMMAND CHAR(1)
) AS
DECLARE VARIABLE SQL_COMMAND VARCHAR(100);
DECLARE VARIABLE TRIGGER_NAME VARCHAR(100);
begin
  -- O valor do parametro eh valido?
  IF (COMMAND IN ('A','D')) THEN
  BEGIN
    -- Laco de pesquisa de todas as triggers das tabelas de usuario.
    FOR SELECT RDB$TRIGGER_NAME FROM RDB$TRIGGERS WHERE RDB$SYSTEM_FLAG = 0 INTO :TRIGGER_NAME DO
    BEGIN
      -- Deve ativar as triggers?
      IF (COMMAND = 'A') THEN
        -- Gera o comando de (re)ativacao da trigger.
        SQL_COMMAND = 'ALTER TRIGGER ' || TRIGGER_NAME || ' ACTIVE';
      ELSE
        -- Gera o comando de desativacao da trigger.
        SQL_COMMAND = 'ALTER TRIGGER ' || TRIGGER_NAME || ' INACTIVE';
      -- Executa dinamicamente o comando SQL gerado.
      EXECUTE STATEMENT SQL_COMMAND;
    END -- FOR
  END -- IF
END^

SET TERM ; ^

Agora, é só executar "EXECUTE PROCEDURE SP_DATABASE_TRIGGERS('D')" para desativar todas as suas triggers de tabelas de usuários, ou 
"EXECUTE PROCEDURE SP_DATABASE_TRIGGERS('A')" para reativá-las.

Espero ter ajudado mais que atrapalhado. :D

Evandro's mailing lists (Please, don't send personal messages to this 
address) escreveu:
>  Caros senhores
>
> É uma pena que não dá para executar DDL nas SPs do firebird senão poderíamos
> ter essa SP para desabilitar todos os triggers do BD.
>
> O único problema é que o FB não permite executar essa linha:
>
> alter TRIGGER :tgrName INACTIVE;
> Acho que vou mesmo é fazer um micro programa em C# que faça isso. Ví que
> essa funcionalidade já está no FB 2.5 mas não quero esperar até lá.
> Abraços
> -Jr
>
>
> SET TERM ^ ;
> CREATE PROCEDURE SP_DATABASE_TRIGGERS_DEACTVATE
> as
> declare variable tgrName char(100);
> declare variable tgrCount int;
> declare variable i int;
> begin
> SELECT count(RDB$TRIGGER_NAME) FROM RDB$TRIGGERS WHERE RDB$SYSTEM_FLAG=0
> into :tgrCount;
>
> WHILE (i <=tgrCount) DO
> BEGIN
>     SELECT
>             RDB$TRIGGER_NAME[:i]
>     FROM RDB$TRIGGERS
>     WHERE RDB$SYSTEM_FLAG=0
>     INTO :tgrName;
>     i=i +1;
>     alter TRIGGER :tgrName INACTIVE;
> end
> end^
> SET TERM ; ^
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>   




Mais detalhes sobre a lista de discussão lista