Em 6 de maio de 2011 14:50, Daniel Cordeiro <[email protected]> escreveu:

>  boa tarde a todos,
>
> 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?

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')*
      );
 );


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
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a