前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POSTGRESQL 如何用系统函数来诊断权限问题

POSTGRESQL 如何用系统函数来诊断权限问题

作者头像
AustinDatabases
发布2023-09-06 10:49:03
2560
发布2023-09-06 10:49:03
举报
文章被收录于专栏:AustinDatabases

开发人员很少关注于数据库系统的权限,而POSTGRESQL 相对于MYSQL来说,他的权限是复杂的,尤其在一些规范的企业,对于权限的要求很高,而随时掌握账号对于数据库OBJECTS的权限的状态,在很多项目中是乙方需要知道该怎么做的。

我们从上到下,一一给大家进行演示,你的用户组需要针对PG中不同的数据库掌握权限,那么那些账号有那些数据库的权限需要进行一个判断。

我们创建一个账号,关于这个账号在什么权限都没有,从下面的函数可以判断,什么都没有的权限的账号可以创建临时表,如果减少用户的名的传参,则为当前的账号是否有对于数据库权限的验证。

代码语言:javascript
复制
postgres=# select has_database_privilege('test','postgres','temp');
 has_database_privilege 
------------------------
 t
(1 row)

postgres=# 
postgres=# select has_database_privilege('test','postgres','temporary');
 has_database_privilege 
------------------------
 t
(1 row)

postgres=# 
postgres=# select has_database_privilege('test','postgres','create');
 has_database_privilege 
------------------------
 f
(1 row)

这里我们继续针对POSTGRESQL 中的某个SCHEMA 进行判断, 一个具有OWNER test_schema的账号,具有创建和usageschema的权限

代码语言:javascript
复制
dvdrental=# 
dvdrental=# select has_schema_privilege('test','test_schema','create');
 has_schema_privilege 
----------------------
 t
(1 row)

dvdrental=# select has_schema_privilege('test','test_schema','usage');
 has_schema_privilege 
----------------------
 t
(1 row)

a

针对表的操作进行权限的判断

代码语言:javascript
复制
dvdrental=# 
dvdrental=# select has_table_privilege('test','TEST_TABLE','select');
 has_table_privilege 
---------------------
 f
(1 row)

ge('test','TEST_TABLdvdrental=# select has_table_privilege('test','TEST_TABLE','insert');
 has_table_privilege 
---------------------
 f
(1 row)

dvdrental=# select has_table_privilege('test','TEST_TABLE','update');
 has_table_privilege 
---------------------
 f
(1 row)

dvdrental=# select has_table_privilege('test','TEST_TABLE','delete');
 has_table_privilege 
---------------------
 f
(1 row)

dvdrental=# select has_table_privilege('test','TEST_TABLE','references');
 has_table_privilege 
---------------------
 f
(1 row)

我们在创建了一个新的schema 并且在新的schema中创建的了表,但是test 用户对于这个数据库下的schema 是owner那么我们创建的这个表test用户是否有权限呢。

代码语言:javascript
复制
dvdrental=# select has_table_privilege('test','test_schema.TEST_TABLE','select');
 has_table_privilege 
---------------------
 f
(1 row)

我们可以看到,test账号对于test_schema 下的表 TEST_TABLE 是没有权限的,我们来验证一遍,通过 test 登陆到系统中,来访问这个表。

在赋予权限后,我们再次通过验证的函数来进行判断,的确赋予权限了。

代码语言:javascript
复制
dvdrental=# select has_table_privilege('test','test_schema.TEST_TABLE','select');
 has_table_privilege 
---------------------
 t
(1 row)

dvdrental=# select has_table_privilege('test','test_schema.TEST_TABLE','update');
 has_table_privilege 
---------------------
 t
(1 row)

dvdrental=# select has_table_privilege('test','test_schema.TEST_TABLE','insert');
 has_table_privilege 
---------------------
 t
(1 row)

dvdrental=# select has_table_privilege('test','test_schema.TEST_TABLE','references');
 has_table_privilege 
---------------------
 f
(1 row)

那么如果针对表中的权限是需要判定多种的权限如何进行操作

select has_table_privilege('test','test_schema.TEST_TABLE','insert,select,update,update with grant option');

最后关于关于开发经常提到的关于函数和存储过程方面的权限问题,我们创建一个函数,一个存储过程。

下面的我们通过has_function_privilege 函数来对test 用户进行执行此函数权限的确认,得到的结果是YES, test 账号对于这个函数是有相关的执行权限的。

同样的,我们创建一个存储过程,我们还是使用上面的函数来判断

SELECT has_function_privilege('test', 'public.insert_data(varchar)', 'execute');

同样使用判断函数权限的方式用在判断存储过程中也是一样的有效。

在postgresql 的使用中,尤其乙方在服务甲方的情况下,很多初级的问题尤其权限都需要介入和解决,以及判断,那么自动化的方式来进行判断对于乙方是非常重要的。

下面的脚本,抛砖引玉,通过相关的函数,将schema下的表的权限进行全面的打印。

代码语言:javascript
复制
SELECT 
     tablename
     ,usename
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'select') AS sel
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'insert') AS ins
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'update') AS upd
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'delete') AS del
FROM
(SELECT * from pg_tables
WHERE schemaname = 'public') as tables
,(SELECT * FROM pg_user) AS users;
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档