SELECT grantee
,table_catalog
,table_schema
,table_name
,string_agg(privilege_type, ', ' ORDER BY privilege_type) AS privileges
FROM information_schema.role_table_grants
WHERE grantee != 'postgres'
-- and table_catalog = 'somedatabase' /* uncomment line to filter database */
-- and table_schema = 'someschema' /* uncomment line to filter schema */
-- and table_name = 'sometable' /* uncomment line to filter table */
GROUP BY 1, 2, 3, 4;
字符串 示例输出:
grantee |table_catalog |table_schema |table_name |privileges |
--------|----------------|--------------|---------------|---------------|
PUBLIC |adventure_works |pg_catalog |pg_sequence |SELECT |
PUBLIC |adventure_works |pg_catalog |pg_sequences |SELECT |
PUBLIC |adventure_works |pg_catalog |pg_settings |SELECT, UPDATE |
...
select a.tablename,
b.usename,
HAS_TABLE_PRIVILEGE(usename,tablename, 'select') as select,
HAS_TABLE_PRIVILEGE(usename,tablename, 'insert') as insert,
HAS_TABLE_PRIVILEGE(usename,tablename, 'update') as update,
HAS_TABLE_PRIVILEGE(usename,tablename, 'delete') as delete,
HAS_TABLE_PRIVILEGE(usename,tablename, 'references') as references
from pg_tables a,
pg_user b
where schemaname='your_schema_name'
and b.usename='your_user_name'
order by tablename;
SELECT
format (
'GRANT %s ON TABLE %I.%I TO %I%s;',
string_agg(tg.privilege_type, ', '),
tg.table_schema,
tg.table_name,
tg.grantee,
CASE
WHEN tg.is_grantable = 'YES'
THEN ' WITH GRANT OPTION'
ELSE ''
END
)
FROM information_schema.role_table_grants tg
JOIN pg_tables t ON t.schemaname = tg.table_schema AND t.tablename = tg.table_name
WHERE
tg.table_schema = 'myschema' AND
tg.table_name='mytable' AND
t.tableowner <> tg.grantee
GROUP BY tg.table_schema, tg.table_name, tg.grantee, tg.is_grantable;
字符串 这里的声明,如果你想得到它的意见:
SELECT
format (
'GRANT %s ON TABLE %I.%I TO %I%s;',
string_agg(tg.privilege_type, ', '),
tg.table_schema,
tg.table_name,
tg.grantee,
CASE
WHEN tg.is_grantable = 'YES'
THEN ' WITH GRANT OPTION'
ELSE ''
END
)
FROM information_schema.role_table_grants tg
JOIN pg_views v ON v.schemaname = tg.table_schema AND v.viewname = tg.table_name
WHERE
tg.table_schema = 'myschema' AND
tg.table_name='myview'
AND tg.grantee <> 'myschema'
GROUP BY tg.table_schema, tg.table_name, tg.grantee, tg.is_grantable
7条答案
按热度按时间oxalkeyp1#
我已经找到了:
字符串
fnatzsnv2#
来自psql的
\z mytable
提供了一个表中的所有赠款,但是你必须按单个用户将其拆分。t30tvxxf3#
下面的查询将给予一个列表,其中包含所有用户及其对架构中表的权限。
字符串
有关
has_table_privilages
的更多详细信息,请参阅here。k4emjkb14#
如果你真的希望每个用户一行,你可以按grantee分组(string_agg需要PG9+)
字符串
这应该输出如下内容:
型
n6lpvg4x5#
此查询将列出所有数据库和模式中的所有表(取消
WHERE
子句中的行以筛选特定的数据库、模式或表),并按顺序显示特权,以便很容易查看是否授予了特定的特权:字符串
示例输出:
型
xbp102n06#
添加到@shruti的回答
为给定用户查询架构中所有表的赠款
字符串
t98cgbkg7#
下面是一个脚本,它为一个特定的表生成授权查询。它忽略了所有者的特权。
字符串
这里的声明,如果你想得到它的意见:
型