管理用户权限
默认情况下,普通用户没有任何权限。高权限用户(包括初始账号)可以为普通用户授予数据库对象的操作权限。
给用户授权,可采用以下两种方式:
为用户授予数据库对象的操作权限。
基于角色为用户授权。
此授权方式可简化多个用户的权限管理操作。例如,当您需要将某个表的读权限授予多个用户时,只要将表的读权限授予角色,再将角色授予多个用户。
授予数据库对象的操作权限
当数据库对象(库,模式,表,视图,序列,函数等)被创建时,所有权限归属于该对象的创建者(Owner)。默认只有对象Owner和RDS_SUPERUSER有权限操作该对象。当其他用户需要相应权限来操作该对象时,需要授权。
下表列出了每种对象的相应权限。
数据库对象 | 权限 |
Tables,Views,Sequences | SELECT INSERT UPDATE DELETE RULE ALL |
Table Column | SELECT INSERT UPDATE |
External Tables | SELECT RULE ALL |
Databases | CONNECT CREATE TEMPORARY | TEMP ALL |
Functions | EXECUTE |
Procedural Languages | USAGE |
Schemas | CREATE USAGE ALL |
每种对象需要单独授权。例如,对Database授予ALL权限(GRANT ALL)并不代表可以访问该Database内部的所有表,只是授予了对该Database的CONNECT、CREATE和TEMP权限。
将表mytable的INSERT权限授权给jsmith。示例如下:
GRANT INSERT ON mytable TO jsmith;
将myschema中所有表的SELECT、TRUNCATE权限授权给jsmith。示例如下:
GRANT SELECT,TRUNCATE ON ALL TABLES IN SCHEMA myschema TO jsmith;
将表mytable col1列的SELECT权限授权给jsmith。示例如下:
GRANT SELECT (col1) on TABLE mytable TO jsmith;
从jsmith回收表mytable的所有权限。示例如下:
REVOKE ALL PRIVILEGES ON mytable FROM jsmith;
基于角色的授权
基于角色为用户授权,具体指创建角色,为角色授权,再将角色授予一个或多个用户。完成后,用户将继承角色的所有权限。下文以一个示例介绍基于角色授权的完整过程。
创建一个拥有CREATEROLE和CREATEDB权限的角色,名称为admin。
CREATE ROLE admin CREATEROLE CREATEDB;
将角色admin的成员资格授予用户john、sally和bob。
GRANT admin TO john, sally, bob;
移除用户bob的角色admin成员资格。
REVOKE admin FROM bob;
对角色admin授予数据库对象的权限。具有角色admin的用户都将继承该权限。
GRANT ALL ON TABLE mytable TO admin;
GRANT ALL ON SCHEMA myschema TO admin;
GRANT ALL ON DATABASE mydb TO admin;
常见问题
如何授予DROP TABLE权限
删除表的权限无法通过GRANT命令授予用户。但表或Schema的所有者(Owner)可以删除表。
高权限用户、表或Schema的所有者,可以将表或Schema的所有者(Owner)变更为目标用户,使目标用户能够删除表。
-- 将表mytable的所有者变更为new_owner。new_owner可以删除表mytable。
ALTER Table mytable OWNER TO new_owner;
-- 将myschema的所有者变更为new_owner。new_owner不仅可以删除表mytable,还可以删除myschema中的所有表。
ALTER SCHEMA myschema OWNER TO new_owner;
如果多个用户都需要删除同一张表的权限,您可以利用角色权限继承的特性,将表或Schema的所有者(Owner)变更某个角色,再将这个角色授予多个用户。
-- 创建一个角色new_role,用于下文的所有者变更。
CREATE ROLE new_role;
-- 将表mytable的所有者变更为new_role。new_role可以删除表mytable。
ALTER Table mytable OWNER TO new_role;
-- 将myschema的所有者变更为new_role。new_role不仅可以删除表mytable,还可以删除myschema中的所有表。
ALTER SCHEMA myschema OWNER TO new_role;
-- 将用户myuser添加为new_role的成员,继承new_role的权限。
GRANT new_role To myuser;