更新时间:2024-06-11 GMT+08:00

如何给指定用户赋予某个SCHEMA的权限?

给某个用户授权某个SCHEMA的权限,包括三个场景(本章节针对SCHEMA层级权限,仅演示授权查询权限,如果需要其他权限,可以参考)《常见问题》中“如何给指定用户赋予某张表的权限?”章节

  • SCHEMA下当前某张表权限。
  • SCHEMA下当前所有表的权限。
  • SCHEMA下未来创建的表的权限。

图1所示,假设有两个用户jim和mike,对应的同名SCHEMA是jim和mike,用户mike需要访问SCHEMA jim的表(包括当前的某张表、所有表、未来创建的表)。

图1 用户mike访问SCHEMA jim下的表

  1. 打开窗口1(即dbadmin连接会话窗口,后续不再提示),使用系统管理员dbadmin连接DWS数据库,创建用户jim和mike(系统默认会创建jim和mike的同名SCHEMA)。

    1
    2
    CREATE USER jim PASSWORD '{password}';
    CREATE USER mike PASSWORD '{password}';
    

  2. 在SCHEMA jim下创建表jim.name和jim.address。

    1
    2
    CREATE TABLE jim.name (c1 int, c2 int);
    CREATE TABLE jim.address (c1 int, c2 int);
    

  3. 给用户mike赋予SCHEMA jim的访问权限。

    1
    GRANT USAGE ON SCHEMA jim TO mike;
    

  4. 某张表权限)给用户mike赋予SCHEMA jim下某张表jim.name的查询权限。

    1
    GRANT SELECT ON jim.name TO mike;
    

  5. 打开窗口2(即用户mike连接会话窗口,后续不再提示),使用用户mike连接DWS数据库,验证mike可以查询jim.name表,但是不能查询jim.address表。

    1
    2
    SELECT * FROM jim.name;
    SELECT * FROM jim.address;
    

  6. 所有表权限)切回窗口1,使用dbadmin给用户mike赋予SCHEMA jim下所有表的查询权限。

    1
    GRANT SELECT ON ALL TABLES IN SCHEMA jim TO mike;
    

  7. 切回窗口2,再次验证mike可以查询所有表。

    1
    2
    SELECT * FROM jim.name;
    SELECT * FROM jim.address;
    

  8. 切回窗口1,创建一张新的表jim.employ。

    1
    CREATE TABLE jim.employ (c1 int, c2 int);
    

  9. 切回窗口2,验证发现用户mike没有jim.employ的查询权限,说明mike虽然有SCHEMA jim下所有表的访问权限,但是对于赋权后新创建的表还是没有访问权限(即mike对SCHEMA jim未来的表权限是没有的)。

    1
    SELECT * FROM jim.employ;
    

  10. (未来表权限)切回窗口1,给用户mike赋予SCHAMA jim未来创建的表的访问权限,并创建一张新的表jim.hobby。

    1
    2
    ALTER DEFAULT PRIVILEGES FOR ROLE jim IN SCHEMA jim GRANT SELECT ON TABLES TO mike;
    CREATE TABLE jim.hobby (c1 int, c2 int);
    

  11. 切回窗口2,验证发现用户mike可以访问jim.hobby。但是对于之前的jim.employ还是没有访问权限(以上ALTER DEFAULT PRIVILEGES语句的授权范围只是未来创建的表,对于已经创建的表,还是要使用GRANT单张表重新授权),此时需要参考4重新授权jim.employ即可。

    1
    SELECT * FROM jim.hobby;