首页 > 解决方案 > 在多租户中调用 postgres 存储过程

问题描述

我的 Postgres 数据库中有多个模式 ( schema1, schema2)。

我正在使用 liquibase 并在每个模式中声明创建过程。在我的示例程序中只做一个select name from users;

Psql 命令\df向我展示了每个模式中的函数。一切似乎都很好

现在在 java 中,当我使用带有模式的 jdbctemplate 调用我的过程时schema1,执行已完成,但我的表用户不存在。我不知道为什么,因为每个模式上都存在表用户。我已将模式名称作为参数添加到我的过程中,并在我的过程开始时对模式名称执行 set search_path 并且一切正常。

但是为什么我需要在我的程序中设置 search_path 呢?我的过程已经在每个模式上定义了,我在 jdbctemplate 调用中设置了模式名称?如果我不设置,为什么找不到我的用户表search_path

标签: javapostgresqlstored-procedures

解决方案


如果您不想设置search_path,则必须使用其完全限定名称引用该表。那就是schema_name.table_name。这是因为在您的情况下search_path默认为"$user", publicso(除非您有与您的用户名匹配的架构)

select name from users;

解析为

select name from public.users;

代替

select name from schema1.users;

推荐阅读