Olá Fabrizio, obrigado pela ajuda,
Em 07-05-2011 10:09, Fabrízio de Royes Mello escreveu:
Tenho uma aplicação que a cada conexão do sistema, ele cria uma
tabela temporária onde persiste informações que normalmente são
utilizadas em algumas procedures em pl/perl.
Acontece que estou querendo gerar uma rotina de histórico de
procedimentos utilizando apenas rules, e um dos parâmetros
essenciais e o id de quem realizou a operação (que consta nesta
tabela temporária). Quando eu crio a rule e a tabela temporária já
esta criada, a rule funciona sem problemas, só que quando eu
reconecto ela não consegue encontrar a tabela temporária novamente
(o schema pg_temp_*X* pode ter uma numeração diferente e parece
que a rule não pesquisa no PATH do sistema). Precisando dar um
replace na rule para ela funcionar.
Não sei se entendi, mas vc mencionou que *a cada conexão do sistema*
vc persiste informações em uma tabela temporária, ou seja, uma tabela
de sessão... certo? Dai vc mencionou que a tabela temporaria nao
existe ao "reconectar"... isso quer dizer que nessa sua "reconexão" vc
não está criando novamente sua tabela de sessão... vc não deveria
padronizar a sua conexao e SEMPRE criar essa sa tabela de sessao?
A tabela temporária é criada a cada sessão autenticada.
O que acontece é que possuo um sistema web onde o controle de acesso é
realizado validando-se login e senha em uma tabela de contas.(Possuo
algumas procedures que realizam o controle de backup de registros que se
baseiam na conta do usuário, e não do usuário do banco utilizado para
conexão da minha aplicação web).*No momento que valido a autenticação,
crio imediatamente esta tabela temporária.*
O que acontece é que, no momento que crio a rule, ele encontra a tabela
temporária da sessão pg_temp_2./tmp_usuario_logado. /Sendo que esta
tabela temporária, em uma outra conexão pode ser criada em outro schema
temporária, como por exemplo /pg_temp_3/ - Dessa forma, a rule não
encontra a tabela, me obrigando a recriar a rule a cada sessão - o que
torna inviável o modelo que pretendo adotar.
Imaginava que RULES se comportavam de maneira semelhante a functions,
que 'compila' o procedimento/função para aquela sessão, obrigando a
utilização de EXECUTE para ter dados dinâmicos. Sendo que o PREPARE não
funciona dentro do corpo de uma RULE.
Pergunto isso pois utilizo mecanismo similar para gerar informações do
meu sistema a cada conexão (sessão) do banco de dados, e para isso
criei funções para fazer a interface:
fc_startsession() - inicializa a sessão (simplesmente cria uma tabela
temporária)
fc_putsession() - armazena um valor na sessão, passamos dois
parâmetros Chave e Valor
fc_getsession() - retorna uma informação da sessão, passamos a Chave e
ela retorna o Valor.
Pensei em utilizar PREPARE e EXECUTE para me trazer os dados,
sendo que PREPARE esta dando problemas dentro da rule. Segue a rule:
/
/
/CREATE or REPLACE RULE historico_cliente_associado AS ON
UPDATE TO tb_clientes_associados /
/DO INSTEAD(/
/ PREPARE id_usuario AS/
/ SELECT id_usuario_cliente /
/ FROM tmp_usuario_logado;/
//
/ INSERT INTO
logs.tb_alteracoes_clientes_associados(nome_abreviado,/
/
porcentagem_plano,/
...
/
usuario_atualizou) /
/ values(old.nome_abreviado,/
/ old.porcentagem_plano,
...
// (EXECUTE id_usuario)/
/ );/
/ );/
Se vc criar uma função para ser uma interface entre a tua estrutura de
dados de sessão e os teus DMLs, etc, vc poderia simplesmente:
CREATE or REPLACE RULE historico_cliente_associado AS ON UPDATE TO
tb_clientes_associados
DO INSTEAD(
INSERT INTO logs.tb_alteracoes_clientes_associados(nome_abreviado,
porcentagem_plano,
...
usuario_atualizou)
values(old.nome_abreviado,
old.porcentagem_plano,
...
* minha_funcao_que_retorna_informacao_da_sessao('ID_USUARIO')*
);
);
Não gostaria de criar funções para carregar um dados que já se encontra
em uma tabela temporária,ainda vou testar outros modelos antes disso,se
não consegui, substituo a RULE por uma TRIGGER que executa uma função
com a ação desejada.
Vc encontra um post interessante em [1] que trata exclusivamente desta
sua necessidade.
[1]
http://www.depesz.com/index.php/2009/08/20/getting-session-variables-without-touching-postgresql-conf/
--
Fabrízio de Royes Mello
>> Blog sobre TI: http://fabriziomello.blogspot.com
>> Perfil Linkedin: http://br.linkedin.com/in/fabriziomello
Obrigado pelo retorno.
Atenciosamente,
+--------------------------------------------------------------------------+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--------------------------------------------------------------------------+
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral