我正在使用PostgreSQL作为数据库开发一个多租户Web应用程序,因为它支持一个数据库实例中的模式。但是我遇到了问题,为租户设置了search_path。
我正在使用WildEE 8.2.0的JavaEE 7。我创建了一个MultiTenantConnectionProvider,它使用DataSourceConnectionProvider加载配置的DataSource。
检索连接的方法将search_path设置为给定的tenantId:
function reply_to(){
$comment =array("Comment"=> $_POST['comment']);
$url="https://outlook.office365.com/api/v1.0/me/messages/'".$_POST['messeg_id']."'/reply";
$data=OutlookService::makeApiCall($_SESSION['access_token'],'POST',$url,$comment);
print_r($data);
}
对于第一次测试,我总是返回相同的tenantId" customer1"。
On Postgres我创建了一个用户,它有自己的数据库和一个架构" customer1"。我有一个实体@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;
}
定义如下:
user
我在架构" customer1"中创建了表格。不,我的问题是表用户的select语句返回另一个用户表。我必须使用表显式设置模式名称,否则我查询错误的表。
声明:
@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;
...
}
返回:
select * from user; -> current_user name: user1
声明:
| current_user name |
--------------------
| "skedflex" |
返回:
select * from customer1.user;
在查询中使用模式名称是没有选择的,因为在运行时确定该值并且我正在使用JPA。因此,在运行时查询执行期间无法插入模式名称。
我原以为,search_path足以查询数据。
答案 0 :(得分:0)
我发现我的设置存在问题。
在PostgreSQL user
中是一个关键字,除了用引号转义用户"user"
之外,无法创建具有此名称的表。我已将表名更改为user_account
,并且查询按预期工作。