Apache Phoenix(十四)新特性之多租户

2020-02-27  本文已影响0人  我知他风雨兼程途径日暮不赏

亮点

多租户表

  多租户表是使用MULTI_TENANT=true DDL属性声明的常规表。它们与租户特定的连接协同工作(下文详细说明)去确保租户智能看到自己的数据。多租户表的第一主键列就是标识租户,例如:

CREATE TABLE base.event (tenant_id VARCHAR, event_type CHAR(1), created_date DATE, event_id BIGINT)
MULTI_TENANT=true;

  标识租户列可以给予任意名称,但必须是VARCHAR或者CHAR类型。常规的Phoenix连接可以不受约束处理表,包括工作在租户边界的数据。

指定租户连接

  租户是通过JDBC连接时TenantID是否存在或者缺失所确定的。一个非空租户信息的连接被认为是指定租户连接。一个连接未指定租户ID或者无租户ID就认为是常规的连接。指定于租户的连接只能查询数据:

Properties props = new Properties();
props.setProperty("TenantId", "Acme");
Connection conn = DriverManager.getConnection("localhost", props);

指定租户视图

  特定于租户的视图只能使用特定于租户的连接创建。它们与视图以相同的方式创建,但是基表必须是多租户表或最终指向一个多租户表的另一个视图。特定于租户的视图通常在需要特定于该租户的新列和/或筛选条件时使用。否则,可以通过如上所述的与租户相关的连接直接使用基表。
  例如,特定于租户的视图可以定义如下:

CREATE VIEW acme.login_event(acme_user_id CHAR(15)) AS
SELECT * FROM base.event
WHERE event_type='L';

  tenant_id列对于特定于租户的视图既不可见也不可访问。对它的任何引用都会导致ColumnNotFoundException。与其他Phoenix视图一样,这个视图是否可更新取决于这里解释的规则。此外,可以将索引添加到特定于租户的视图中,就像添加到常规表和视图中一样(有这些限制)。

租户数据隔离

  使用特定于租户的连接在多租户表上执行的任何DML或查询都会自动限制为只操作租户的数据。对于upsert操作,这意味着Phoenix将自动使用在连接时指定的租户id填充tenantId列。对于查询和删除,透明地添加了一个where子句,以约束操作只查看属于当前租户的数据。

上一篇 下一篇

猜你喜欢

热点阅读