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

场景分析

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

方案设计

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