2014-07-25 3:15 GMT-03:00 Wellington <wm...@yahoo.com.br>:

>  quando eu executo o comando "SET search_path TO nome_schema" dentro de
> uma funcao, em uma mesma sessao, o SGDB nao altera o search_path nos
> comandos executados apos o primeiro, me parece que o schema fica em um tipo
> de cache.
>
> Duvida: Existe alguma forma de contornar isso?
>
>

O que creio que está acontecendo é que quando você executa uma função
PL/pgSQL a primeira vez é feito o cache dos planos de execução, e esse
cache utiliza o oid das relações e não o nome exato que você passou. Assim
sendo, na primeira execução será usada as tabelas respeitando o search_path
informado, nas próximas execuções, mesmo alterando o search_path, ele irá
continuar com o plano de execução com o search_path anterior.

Agora. O comportamento quanto a isso foi alterado na versão 9.3 [1]:

"Force cached plans to be replanned if the search_path changes (Tom Lane)

Previously, cached plans already generated in the current session were not
redone if the query was re-executed with a new search_path setting,
resulting in surprising behavior."

Ou seja, sempre que o search_path é alterado, os planos armazenados são
descartados. O efeito que isso causa é que se você altera sempre o
search_path, sempre irás ter que fazer o planejamento dos planos e não
utilizará o cache.


Sei que posso usar o comando "Execute" passando o schema em uma variavel,
> mas gostaria de evitar fazer comandos sql concatenando Strings.
>


Sim. Você pode, na verdade nem precisa passar o schema como variável, as
consultas executadas pelo EXECUTE não têm os planos "cacheados", basta
executá-las então que o search_path corrente será sempre respeitado. As
outras alternativas são: clonar sua função em cada esquema ou atualizar
para a 9.3.


[1] http://www.postgresql.org/docs/9.3/static/release-9-3.html

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a