我使用的是Postgres 9.5,我有一个表,用于记录和设置数据库表上的用户特权(调用了一个函数,用于根据该表的条目设置特权)。该表包括以下列:
can_...
列用于其他特权)仅在用户应具有至少SELECT
特权的那些表-用户组合中才存在条目。
出于质量检查的目的,我想编写一个函数将此表与information_schema.table_privileges
进行比较,并输出用户特权和实际特权之间存在差异的情况。这是到目前为止我得到的:
select
i.grantee,
p.user_name as priv_user,
i.table_name,
p.table_name as priv_table,
i.table_schema,
p.table_schema as priv_schema,
i.privilege_type,
p.can_select, p.can_insert, p.can_update, p.can_delete, p.can_truncate
from information_schema.table_privileges i
full outer join priv.dashboard_table_access p
on
i.grantee = p.user_name and
i.table_name = p.table_name and
i.table_schema = p.table_schema
where (i.grantee in ('user1', 'user2')
or p.user_name in ('user1', 'user2'))
and (i.privilege_type is null or p.can_select is null)
这将列出每个表中的条目,而另一个表中没有相应的条目。但是,我仍然缺乏一种方法来检测特权本身是否未按需要设置(例如,INSERT
已被授予,即使不应该将can_insert
设置为false
)。因为我对SQL还很陌生,所以我不知道如何将information_schema.table_privileges
的每行设置的一种特权与我自己的每列表的一种特权相匹配。我只想在查询的输出中出现另一条记录,以引起人们注意在特定情况下某些问题的事实。
感谢您的帮助。