13. 权限管理

2021-08-14  本文已影响0人  shark_tear

在PostgreSQL中是通过角色来控制用户的权限的,这一点我们在上一章已经讲过。即不同的角色拥有不同等级的权限。但是什么是权限,以及怎么修改权限呢?本章来讲解这些内容。
在PostgreSQL中,权限就是用来控制数据库对象(如数据库、模式、表、函数、触发器等)的一种属性。通过这种属性,可以控制对象的增删改查等等操作。在数据库对象创建出来的时候就会自动和相关的权限进行关联。

在前面角色一章里,我们主要讲的是角色对整个数据库模式或者数据库实例的权限,比如它的权限等级分为:

这里面设计到的权限主要是针对数据库模式或者数据库实例整体上来讲的。而这一章里,我们则要深入到数据库实例的内部,讲解针对数据库内部对象的权限控制。其中内部对象包括且不限于以下列出的内容:

等等。而对这些对象可能的权限控制包括且不限于:

进行这些对象的权限控制主要通过GRANT 和 REVOKE这两个子命令来控制,这两个子命令的基本格式是:

GRANT/REVOKE some_privileges ON database_object object_name TO rolename;

具体的框架就是这样,下面来看用法示例:

# 1. 设置数据库的权限
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] 
| ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

# 2. 设置模式的权限
GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

# 3. 设置表的权限
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }[, ...] 
| ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]  | ALL TABLES IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]

# 4. 设置表空间的权限
GRANT { CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE tablespace_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

# 5. 设置表内行的权限
GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )[, ...] 
| ALL [ PRIVILEGES ] ( column_name [, ...] ) }
ON [ TABLE ] table_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

# 6. 设置序列的权限
GRANT { { USAGE | SELECT | UPDATE }[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE sequence_name [, ...] | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]

# 7. 设置函数的权限
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...]
| ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]

# 8. 设置大对象的权限
GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT loid [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

上面是一些常见的数据库对象的操作权限赋权命令用法,此外,对一些不常见的数据库对象赋权命令,这里我们也列出来,后面用到的时候再过来查询即可。如下所示:

# 1. 设置DOMIAN的权限
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON DOMAIN domain_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

# 2. 设置外部数据引用的权限
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER fdw_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

# 3. 设置外部服务器的权限
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER server_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

# 4. 设置语言的权限
GRANT { USAGE | ALL [ PRIVILEGES ] } 
ON LANGUAGE lang_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

# 5. 设置类型的权限
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON TYPE type_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]

上面的所有命令示例中,role_specification可以是下面的值:

role_name | PUBLIC | CURRENT_USER | SESSION_USER

在上面列出来的角色类型里,各个关键字的含义是:

上面的示例代码中,把每个数据库对象可以赋予的权限都列出来了。因此,在使用上面的命令的时候,不要给一些数据库对象赋予不存在的权限。比如给序列赋予DELETE权限,就会报错,如下面所示:

jiahedc1=# grant DELETE on SEQUENCE ds_area_id_seq to dbuser; 
ERROR:  invalid privilege type DELETE for sequence
GRANT role_name [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ]
上一篇下一篇

猜你喜欢

热点阅读