您可以通过访问权限查询功能检查各种类型的数据库对象的授权。这些都在单个对象的级别上工作,因此对于任何类型的数据库范围检查,您都需要将它们与目录查询结合起来。您还需要查阅目录以获取任何所有权信息。在编写这些查询时,OID 类型非常有用。
要检查用户b
是否对 schema 中的所有表具有只读访问权限p
:
SELECT EVERY(
has_table_privilege('b', oid, 'SELECT') AND
NOT has_table_privilege('b', oid, 'INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER')
)
FROM pg_class
WHERE relkind = 'r'
AND relnamespace = 'p'::regnamespace
(请注意,表权限被列级授权所取代,因此您可能也需要检查这些权限。)
检查是否a
是超级用户:
SELECT rolsuper
FROM pg_roles
WHERE rolname = 'a'
要检查是否a
拥有所有数据库(由 创建的数据库除外initdb
):
SELECT EVERY(datdba = 'a'::regrole)
FROM pg_database
WHERE datname NOT IN ('postgres', 'template0', 'template1')