我们创建一个账号,关于这个账号在什么权限都没有,从下面的函数可以判断,什么都没有的权限的账号可以创建临时表,如果减少用户的名的传参,则为当前的账号是否有对于数据库权限的验证。
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的权限
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
针对表的操作进行权限的判断
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用户是否有权限呢。
dvdrental=# select has_table_privilege('test','test_schema.TEST_TABLE','select');
has_table_privilege
---------------------
f
(1 row)
我们可以看到,test账号对于test_schema 下的表 TEST_TABLE 是没有权限的,我们来验证一遍,通过 test 登陆到系统中,来访问这个表。
在赋予权限后,我们再次通过验证的函数来进行判断,的确赋予权限了。
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下的表的权限进行全面的打印。
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;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




