本文以案例分析的形式为您介绍如何实现行级别权限控制。

场景分析

假设Project A中的表table_order是所有商家的订单交易信息表。该表可以开放给商家查看,但要求每个商家只能查看自己家店铺的订单交易信息。

方案设计

表table_order中有商家ID,可以根据商家ID进行过滤,将各个商家限制于只读自己的数据,因此需要行级别的权限控制。MaxCompute不支持行级别的权限控制,但您可以通过如下方案实现行级别权限控制的需求:
  • 方案一:在表table_order下游单独为每个商家创建独立的表,将表赋权给对应的商家。这种方式可以满足行级别权限控制的需求,但会导致数据重复存储。一旦table_order数据有更新,下游的表也需要同步更新才能保持数据一致。
  • 方案二:在表table_order下游单独给每个商家创建独立的视图,将视图赋权给对应的商家。这种方式可以满足行级别权限控制的需求,同时避免了方案一的弊端。
评估两个方案之后,建议您采用方案二,通过创建视图方式实现行级别权限控制。具体操作如下:
  1. 在Project A中创建视图。
    CREATE VIEW <viewname> as select * from table_order WHERE sellerid='xxxx';
  2. 在Project A中创建Package,通过Package资源共享方式将视图授权给商家。
    --创建Package。
    create package <packagename>;
    --将表添加至Package中。
    add table <viewname> to package <packagename>;
    --将Package资源共享给商家。
    allow project <Projectname_seller> to install package <packagename>;
  3. 商家使用视图。如下命令均需要在商家的Project中执行。
    --在商家项目空间中安装Package。
    install package <ProjectA>.<packagename>;
    --将Package的读权限赋予给商户。
    grant read on package <ProjectA>.<packagename> to user <username>;
说明 本案例演示的是通过Package方式授权视图权限,您也可以直接执行如下命令授权给用户视图的select和describe权限。具体的使用方式取决于现实业务需求。
grant select,describe on table <viewname> to user <username>;