在从.sql文件填充之后,以编程方式测试Postgres DB以获得正确的权限

时间:2017-02-06 13:01:19

标签: postgresql postgresql-9.6

我有一个项目,其中postgres db在ci测试服务器中以.sql文件播种。这将构建并作为泊坞窗图像发布。

现在,我不会是唯一一个将这些.sql文件推送到服务器的人。 因此,我需要检查所有postgres用户(可能是未来用户)对此文件引入的所有数据库的权限。

实施例: 用户A和B. 用户A是超级用户并拥有所有数据库。 用户B只能读取能够在数据库X中读取。 等等

有没有办法测试这个programmaticaly ?除了'尝试从Y读作B - >错误?

到目前为止,我发现的所有其他解决方案都是手动或“尝试/错误”解决方案。

1 个答案:

答案 0 :(得分:0)

您可以通过access privilege inquiry functions检查各种类型的数据库对象的授权。这些都在单个对象的级别上工作,因此对于任何类型的数据库范围的检查,您都需要将它们与catalog个查询组合在一起。您还需要查阅目录以获取任何所有权信息。在编写这些查询时,OID types 非常非常有帮助。

检查用户b是否具有对架构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')