GP数据库使用角色管理数据库权限。角色包括用户和用户组,其独立于操作系统管理的用户和用户组。另外角色被定义在数据库系统层面上,因此对数据库系统中的所有数据库都有效。
一、数据库角色
1、属性
login privilege: 只有具有Login属性的角色才能被用于数据库连接,其中 create user 默认有login属性,而create role 则没有login属性。
superuser status:超级用户属性,该属性会绕开除登录权限以外的所有权限检测。创建一个超级用户 create role name superuser。
database creation: 创建数据库要给与的权限。create role name createdb。
role creation: 创建角色要给与的权限。create role name createrole。
password: 创建认证口令。create role name password 'xxx'。
2、角色和成员关系
在实际操作用通常会将用户归属于组角色,对一个组进行权限管理。
组角色中的成员可以通过两种方式使用角色的权限:
一个组的每一个成员可以显示的使用set role 临时成为组角色。
有inherit 属性的成员角色会自动具有所属组角色的权限。
这里需要注意的是删除一个角色时,需要先删除或转移该用户所拥有的对象,以及回收被授予的权限。
3、角色操作
创建
create role name;
删除
drop role name;
查看
select rolname from pg_roles;
示例:
创建带有登录属性的角色:
create role name with login password 'xxx';
二、对象权限
在表、视图、序列、数据库、函数、语言、空间等对象被创建时,会被指派一个拥有者。如果想其他角色拥有和拥有者一样操作这些对象,需要赋予一定的对象权限。需要注意的是以上权限必须为每一个对象单独授权。如 在一个数据上授予all 权限,不代表完全的权限,仅代表 connect、create 、temporary 权限。
对象 | 权限 |
表、序列、视图 | select 、insert 、update、delete、rule、all |
外部表 | select、rule、all |
数据库 | connect、create、temporary|temp、all |
函数 | execute |
语言 | usage |
方案 | create、usage、all |
三、权限操作
和普通数据库一样,权限的操作通过grant 实现。
语法:
GRANT 权限类型 ON Relation(如 表、视图、函数、schema等) TO 用户或组;
详细可通过\h grant 查询。
权限按用户、库、模式、表、索引、字段等层次进行管理。
用户的特殊属性的权限
创建登录属性权限的账户
create role user1 with login password 'xxx';
删除没有权限的用户
drop role if exists user1;
删除有权限的用户(需要先撤销权限)
revoke connect on database test from user1;
drop user user1;
数据库的权限
赋权
grant create on database test to user1;
撤除权限
revoke create on database test from user1;
注意:
将数据库上的权限 create 、connect、temp 全部删除后,仍有 connect 和 temp 权限,这两个为默认的属性权限。此时不可以创建 schema,仍可以在public 下创建表,对其他owner不是自己的schema无权限。
create 在数据库上的权限包括 创建 库、schema、表、查询表数据的权限。
模式的权限
主要用于给其他角色、用户赋予能够操作owner 不是自己的schema 的权限。
赋权
grant create on schema schema1 to user2;
grant usage on schema schema1 to user2;
撤销
revoke select, update,delete,insert on schema1.table1 from user1;
revoke usage on schema schema1 from user1;
revoke create on schema schema1 from user1;
注意:
如果想操作owner 不是自己的schema, 需要被赋予 create 、usage 权限。
用户默认不能在不属于自己的schema 创建表,但可以在public 下创建。
用户默认不能查看不属于自己的schema下的表(注意设置 search_path)。
单独赋予 usage 权限可以查看,单独赋予create 权限可以创建但不能查看,所以必须2个权限都有。
用户user1的schema 信息无法分配给user2用户。
操作数据库对象的权限
表赋权
grant select, update, delete, insert on schema1.table1 to user2;
撤销
revoke select, update, delete, insert on schema1.table1 to user2;
用户的特殊属性上的权限
user 的 superuser 和 createuser 属性不能同时拥有。
superuser 属性的用户实际拥有创建库、用户的权限,nocreateuser nocreatedb 等属性没有约束。
create role 创建用户;alter role 修改用户属性;drop role 删除用户;drop database 删除库。
拥有资源的用户不能被drop, 但资源可以被superuser drop掉。
四、生产实例
创建用户
create user user1 with login password 'xxxx';
create user user2 with login password 'xxxx';
创建schema
create schema schema_1;
create schema schema_2;
创建角色, 拥有查看 schema_1, schema_2 所有表, 以及使用权限。
create role role_1;
grant usage on schema schema_1 to role_1;
grant usage on schema schema_2 to role_1;
grant select on all tables in schema schema_1 to role_1;
grant select on all tables in schema schema_2 to role_1;
-- 赋予用户对schema 所有权限
grant all privileges on schema schema_1 to role_1;
将角色赋予用户
grant role_1 to user1;
grant role_1 to user2;
设置用户默认路径
alter user user1 set search_path to schema_1;
alter user user2 set search_path to schema_1;
表交接(如果需要表交接)
alter table test_table owner to user1;
五、参考
http://docs-cn.greenplum.org/v6/admin_guide/roles_privs.html