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

Responder a