[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