gpt4 book ai didi

PostgreSQL 使用 search_path 进行 Multi-Tenancy

转载 作者:行者123 更新时间:2023-11-29 13:56:07 25 4
gpt4 key购买 nike

我正在开发一个使用 PostgreSQL 作为数据库的 Multi-Tenancy Web 应用程序,因为它支持一个数据库实例中的模式。但我遇到了一个问题,为租户设置搜索路径。

我正在使用 JavaEE 7 和 Wildfly 8.2.0。我创建了一个 MultiTenantConnectionProvider,它使用 DataSourceConnectionProvider 加载配置的 DataSource。

检索连接的方法将 search_path 设置为给定的 tenantId:

@Override
public Connection getConnection(String tenantId) throws SQLException
{
Connection con = getAnyConnection();
try
{
con.createStatement().execute("SET search_path = '" + tenantId + "'");
LOG.info("Using " + tenantId + " as database schema");
}
catch (SQLException ex)
{
throw new HibernateException("Could not alter connection for specific schema");
}
return con;
}

对于第一次测试,我总是返回相同的 tenantId“customer1”。

在 Postgres 上,我创建了一个用户,它有自己的数据库和一个模式“customer1”。我有一个实体 user 定义如下:

@Entity
@Table(name = "user")
public class User implements Serializable
{
@Id
@GeneratedValue
private Long id;
@Column(unique = true, nullable = false)
private String username;
private String firstname;
private String lastname;
private String gender;
@Column(unique = true, nullable = false)
private String email;
@Column(nullable = false)
private byte[] password;
private String passwordResetToken;
@Column(nullable = false)
private byte[] salt;
...
}

我已经在模式“customer1”中创建了表。现在我的问题是表用户的选择语句正在返回另一个用户表。我必须使用表显式设置架构名称,否则我会查询错误的表。

声明:

select * from user; -> current_user name: user1

返回:

| current_user name |
--------------------
| "skedflex" |

声明:

select * from customer1.user;

返回:

| id | username | firstname | lastname | ... |
----------------------------------------------
| 1 | johnnie | John | Doe | ... |

无法在查询中使用架构名称,因为该值是在运行时确定的,而我使用的是 JPA。因此无法在运行时查询执行期间插入架构名称。

我曾预计,search_path 足以查询数据。

最佳答案

我发现我的设置有问题。在 PostgreSQL 中,user 是一个关键字,不能创建具有此名称的表,除非 user 用引号转义:"user"。我已将表名更改为 user_account 并且查询按预期工作。

关于PostgreSQL 使用 search_path 进行 Multi-Tenancy ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31505665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com