将具有多行/多列信息的两个表联接起来

时间:2018-07-12 07:55:08

标签: sql postgresql join privileges

我使用的是Postgres 9.5,我有一个表,用于记录和设置数据库表上的用户特权(调用了一个函数,用于根据该表的条目设置特权)。该表包括以下列:

  • 表名
  • schema_name
  • 用户名
  • can_select
  • can_insert(还有其他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的每行设置的一种特权与我自己的每列表的一种特权相匹配。我只想在查询的输出中出现另一条记录,以引起人们注意在特定情况下某些问题的事实。

感谢您的帮助。

0 个答案:

没有答案