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

Sandro Souza escovadordebits em gmail.com
Qua Maio 20 10:48:46 -03 2009


Bom dia/tarde Evandro.

Grande Evandro, fico muito feliz em poder lhe ajudar.

Aqui nesse fórum participam excelentes colaboradores, e nada como usar o
pouco que sabemos para ajudar a quem precisa.

Todos os dias eu também aprendo mais um pouco nesse fórum.

Precisando de ajuda, é só avisar. :D

2009/5/20 Evandro's mailing lists (Please, don't send personal messages to
this address) <listasjr em gmail.com>

> Rapaz, escovador de bits man!
>
> Com certeza você atrapalhou demais!!! :D
> Você é o cara! A sua SP ficou "chocrível", sinistra :)
> Essa SP já deveria vir presentes em todos os bancos criados.
>
> Eu achava que a SP não permitia executar DDL por motivo de segurança.
> Não sei se isso é intencional, preguiça de pessoal para implementar
> DDL na SP, ou só uma falha de segurança mesmo. Bem isso na verdade nem
> importa. Você deu um jeitinho.
>
> Estava fazendo usando o IBPP (driver do FB para C++, excelente) só
> para fazer isso! E ainda precisava de arquivo de configuração com os
> parâmetros do banco.
>
> Acabei de abandonar esse micro projeto:
>
> const std::string UserName = "";
> const std::string Password = "";
> const std::string Port = "";
> const std::string File = "";
> IBPP::Database db1;
> db1 = IBPP::DatabaseFactory(ServerName, DbName, UserName, Password);
> db1->Connect();
> IBPP::Transaction tr1 = IBPP::TransactionFactory(db1,
> IBPP::amWrite, IBPP::ilConcurrency, IBPP::lrWait);
> tr1->Start();
> IBPP::Statement st1 = IBPP::StatementFactory(db1, tr1);
> st1->ExecuteImmediate("---- listar triggers e desabilitar-------");
>
>
> Obrigado mesmo,
> Evandro
>
>
>
> 2009/5/20 Escovador de Bits <escovadordebits em gmail.com>
> 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
>
>
>
>
>
>
> --
> Evandro M Leite Jr
> PhD Student & Software developer
> University of Southampton, UK
> Personal website: http://evandro.org
> Academic website: http://www.soton.ac.uk/~evandro<http://www.soton.ac.uk/%7Eevandro>
> Please, use JrΘevandro.org for personal messages
>
> ______________________________________________
> 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