[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