在 PostgreSQL 维护过程中,表,视图的权限查看是很平常的工作,本文从一张视图的权限开始,简单的介绍权限查看的几种方法。
一张视图
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
[pg93@redhatB ~]$ psql francs francs psql (9.3beta1) Type "help" for help. francs=> /d+ view1_test View "francs.view1_test" Column | Type | Modifiers | Storage | Description --------+-----------------------+-----------+----------+------------- id | integer | | plain | name | character varying(64) | | extended | View definition: SELECT test_view1.id, test_view1.name FROM test_view1;
|
备注:假设系统有如上视图,如何查看这张视图的权限呢?大概有以下几种方法:
方法一: 通过 /dp 元子命令
1 2 3 4 5 6 7
|
francs=> /dp view1_test Access privileges Schema | Name | Type | Access privileges | Column access privileges --------+------------+------+-----------------------+-------------------------- francs | view1_test | view | francs=arwdDxt/francs+| | | | select_only=rw/francs | (1 row)
|
备注:/dp
后接表名或视图名查看对像权限,个人推荐这种方法,因为简单,但要会看输出的格式。例如,什么是 “arwd…?” , 详见附一: ACL 权限列表。
方法二: 通过 aclexplode 函数
2.1 查看 acl
1 2 3 4 5
|
francs=> select oid,relname ,relacl from pg_class where relname='view1_test'; oid | relname | relacl -------+------------+----------------------------------------------- 16492 | view1_test | {francs=arwdDxt/francs,select_only=rw/francs} (1 row)
|
备注: pg_class.relacl 输出实际上和 dp 显示的值类似。
2.2 解析 acl 权限
1 2 3 4 5 6 7 8 9 10 11 12 13
|
francs=> select * From aclexplode('{francs=arwdDxt/francs,select_only=rw/francs}'); grantor | grantee | privilege_type | is_grantable ---------+---------+----------------+-------------- 16384 | 16384 | INSERT | f 16384 | 16384 | SELECT | f 16384 | 16384 | UPDATE | f 16384 | 16384 | DELETE | f 16384 | 16384 | TRUNCATE | f 16384 | 16384 | REFERENCES | f 16384 | 16384 | TRIGGER | f 16384 | 16496 | SELECT | f 16384 | 16496 | UPDATE | f (9 rows)
|
备注:aclexplode 函数将 acl 转换成易读的格式。
2.3 找到对应用户
1 2 3 4 5 6
|
francs=> select oid,rolname from pg_roles where oid in (16384,16496); oid | rolname -------+------------- 16384 | francs 16496 | select_only (2 rows)
|
方法三: 通过 table_privileges 视图
3.1 查看 information_schema.table_privileges
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
francs=> select grantor,grantee,table_schema,table_name,privilege_type from information_schema.table_privileges francs-> where table_name='view1_test'; grantor | grantee | table_schema | table_name | privilege_type ---------+-------------+--------------+------------+---------------- francs | francs | francs | view1_test | INSERT francs | francs | francs | view1_test | SELECT francs | francs | francs | view1_test | UPDATE francs | francs | francs | view1_test | DELETE francs | francs | francs | view1_test | TRUNCATE francs | francs | francs | view1_test | REFERENCES francs | francs | francs | view1_test | TRIGGER francs | select_only | francs | view1_test | SELECT francs | select_only | francs | view1_test | UPDATE (9 rows)
|
备注:上面格式简单多了,用户 select_only 对视图 view1_test 只有 SELECT,UPDATE 权限。
附: ACL 权限列表
Relacl Code |
Privilege Name |
a |
INSERT |
r |
SELECT |
w |
UPDATE |
d |
DELETE |
D |
TRUNCATE |
x |
REFERENCES |
t |
TRIGGER |
arwdDxt |
ALL |
备注:建议牢记以上权限代码,才能完全看懂 dp 输出。
参考
原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/237978.html