权限分类
-
系统权限
-
对象权限
1.数据库databases
connect 允许用户连接到指定的数据库
create 允许在数据库中创建新的模式
2.模式 SCHEMA
CREATE 允许在模式中创建新的对象
USAGE 允许访问包含在指定模式中的对象,若没有该权限,则只能看到这些对象的名字
3.函数 FUNCTION
EXECUTE允许使用指定的函数,以及利用这些函数实现的操作符
4.表空间 TABLESPACE
CREATE允许在表空间中创建表,允许在创建数据库和模式的时候把该表空间指定为缺省表空间。
5.表TABLE
INSERT\DELETE\UPDATE\SELECT 允许用户对指定表进行增删改查操作
TRUNCATE 允许执行TRUNCATE语句删除指定表中的所有记录。
REFERENCES 创建一个外键约束,必须拥有参考表和被参考表的REFERENCES权限 -
角色权限
说明
- 系统权限
1.系统权限又称为用户属性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN、MONADMIN、OPRADMIN、POLADMIN、INHERIT、REPLICATION、VCADMIN和LOGIN等。
系统权限一般通过CREATE/ALTER ROLE语法来指定。其中,SYSADMIN权限可以通过GRANT/REVOKE ALL PRIVILEGE授予或撤销。但系统权限无法通过ROLE和USER的权限被继承,也无法授予PUBLIC。 - 对象权限
1.要撤消已经授予的权限,可以使用REVOKE。
2.对象所有者的权限(例如ALTER、DROP、COMMENT、INDEX、VACUUM、GRANT和REVOKE)是隐式拥有的,即只要拥有对象就可以执行对象所有者的这些隐式权限。对象所有者可以撤消自己的普通权限。
3.数据库提供对象隔离的特性,对象隔离特性开启时,用户只能查看有权限访问的对象(表、视图、字段、函数),系统管理员不受影响。
4.DATABASE、SCHEMA和USER名使用小写。数据库会默认把其名转为小写,连接串里面如果出现大写的对象名无法连接到数据库。
5.优先通过角色来管理权限。使用角色管理权限,再将角色赋予用户。例如:
角色和用户为多对多关系,一个角色可以赋予多个用户,修改角色中的权限,被赋予角色的用户权限就可以同时更新。
删除用户时,不会影响到角色。
新建用户后可以通过赋予角色快速获取所需权限。
6.关键字PUBLIC表示该权限要赋予所有角色,包括以后创建的用户。PUBLIC可以看做是一个隐含定义好的组,它总是包括所有角色。任何角色或用户都将拥有通过GRANT直接赋予的权限和所属的权限,再加上PUBLIC的权限。 - 角色权限
笔记
# gaussdb中查看用户都有哪些表的权限
SELECT * FROM information_schema.table_privileges WHERE GRANTEE='user_name';
#将表或视图的访问权限赋予指定的用户或角色
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ALTER | DROP | COMMENT | INDEX | VACUUM } [, ...]
| ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
TO { [ GROUP ] role_name | PUBLIC } [, ...]
[ WITH GRANT OPTION ];
# 将表中字段的访问权限赋予指定的用户或角色
GRANT { {{ SELECT | INSERT | UPDATE | REFERENCES | COMMENT } ( column_name [, ...] )} [, ...]
| ALL [ PRIVILEGES ] ( column_name [, ...] ) }
ON [ TABLE ] table_name [, ...]
TO { [ GROUP ] role_name | PUBLIC } [, ...]
[ WITH GRANT OPTION ];
#将数据库的访问权限赋予指定的用户或角色
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...]
| ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
TO { [ GROUP ] role_name | PUBLIC } [, ...]
[ WITH GRANT OPTION ];
#将函数的访问权限赋予给指定的用户或角色
GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]
| ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
TO { [ GROUP ] role_name | PUBLIC } [, ...]
[ WITH GRANT OPTION ];
#将存储过程的访问权限赋予给指定的用户或角色
GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
ON { PROCEDURE {proc_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]
TO { [ GROUP ] role_name | PUBLIC } [, ...]
[ WITH GRANT OPTION ];
#回收指定表或视图上的权限
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM }[, ...]
| ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
FROM { [ GROUP ] role_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ];
#回收表上指定字段的权限
REVOKE [ GRANT OPTION FOR ]
{ {{ SELECT | INSERT | UPDATE | REFERENCES | COMMENT } ( column_name [, ...] )}[, ...]
| ALL [ PRIVILEGES ] ( column_name [, ...] ) }
ON [ TABLE ] table_name [, ...]
FROM { [ GROUP ] role_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ];
# 回收指定数据库上的权限
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...]
| ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
FROM { [ GROUP ] role_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ];
#回收指定函数上的权限
REVOKE [ GRANT OPTION FOR ]
{ { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]
| ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
FROM { [ GROUP ] role_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ];
#回收指定存储过程上的权限
REVOKE [ GRANT OPTION FOR ]
{ { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
ON { PROCEDURE {proc_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]
| ALL PROCEDURE IN SCHEMA schema_name [, ...] }
FROM { [ GROUP ] role_name | PUBLIC } [, ...]
[ CASCADE | RESTRICT ];
#授予用户 user_name 对 database_name.table_name 表的 SELECT、INSERT、UPDATE、DELETE 权限。
GRANT SELECT,INSERT,UPDATE,DELETE ON database_name.table_name TO user_name;
#授予用户 user_name 对 database_name.table_name 的所有权限。
GRANT ALL PRIVILEGES ON database_name.table_name TO user_name;
#授予用户 user_name 对 database_name.table_name 的 SELECT、INSERT、UPDATE、DELETE 权限,并允许他将该权限传递给其他用户。
GRANT SELECT,INSERT,UPDATE,DELETE ON database_name.table_name TO user_name WITH GRANT OPTION;
#撤销用户 user_name 对 database_name.table_name 表的 SELECT、INSERT、UPDATE、DELETE 权限。
REVOKE SELECT,INSERT,UPDATE,DELETE on database_name.table_name FROM user_name;
#撤销用户 user_name 对 database_name.table_name 的所有权限。
REVOKE ALL PRIVILEGES ON database_name.table_name FROM user_name;
#撤销用户 user_name 对 database_name.table_name 表的 SELECT、INSERT、UPDATE、DELETE 权限。
#Tip:一个用户只能撤销由它自己直接赋予的权限,依赖性权限仍然存在,但如果声明了CASCADE,则所有依赖性权限都被撤销.
REVOKE SELECT,INSERT,UPDATE,DELETE ON database_name.table_name FROM user_name WITH GRANT OPTION;
#切换用户
set role joe password "gaussdb@123";
#更改用户joe的系统权限,为它添加创建用户的系统权限并去掉它创建数据的系统权限,执行如下命令
ALTER USER joe WITH NOCREATEDB CREATEROLE PASSWORD "Gauss@123";
#删除用户
DROP USER joe;
#将用户tom下的同名schema权限赋给jerry
grant usage on schema tom to jerry;
#将用户tom已经创建的表的select权限赋给jerry
grant select on all tables in schema tom to jerry;
#将用户tom未来在同名schema下创建的表的select权限赋给jerry -- 注意,其中for user tom是必须的,表示把用户tom将来在schema tom下创建的表的只读权限赋权给jerry -- 如果不加for user tom,缺省值为当前角色/用户
alter default privileges for user tom in schema tom grant select on tables to jerry;
#查看某张表当前的权限情况
select relname,relacl from pg_class where relname = 'pg_class';
#创建用户
create user test password "Gauss@123";
#创建角色
create role test password "Gauss@123"; 用户可以登陆,角色不可以登陆数据库。
#移除用户权限 角色可以赋权给用户,用户也可以赋权给角色
revoke test1 from test2;
# 重置用户密码
alter user test2 password "GaussDB@123";
# 执行用户的锁定与解锁
alter user test account lock;
alter user test account unlock;
#检查系统中都有哪些用户,知道每个用户是做什么用的,删除多余用户
select rolname from pg_roles;
# 检查系统的初始化用户是哪个
select * from pg_roles where rolsuper=true;
#检查createdb\createrole\operadmin权限
#拥有operadmin权限的角色可以使用roach工具执行恢复
select rolname,createdb,createrole,operadmin from pg_roles;
#检查哪些用户拥有数据库管理员权限
selec rolname from pg_roles where rolpolicyadmin=true;
#配置用户角色的有效期
select rolname,rolvalidbegin,rolvaliduntil from og_roles where rilsuper=false; #查询有效期
alter role <rolnama> valid begin '2020-02-02 00:00:00' valid until '2024-02-02 00:00:00'; #修改有效期
#配置用户的最大连接数
#不应该允许用户无限制数量的连接,如果用户参数rolconnlimit设置为1,表示允许无限制的数量的并发连接。
alter role <rolname> connection limit <connection_num>; #配置
select rolname,rolconnlimit from pg_roles where rolconnlimit=-1;