PostgreSQL使用search_path进行多租户

时间:2015-07-19 20:32:54

标签: postgresql jpa multi-tenant java-ee-7

我正在使用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足以查询数据。

1 个答案:

答案 0 :(得分:0)

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