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

Evandro's mailing lists (Please, don't send personal messages to this address) listasjr em gmail.com
Qua Maio 20 10:03:22 -03 2009


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
Please, use JrΘevandro.org for personal messages




Mais detalhes sobre a lista de discussão lista