如何查詢授予postgres中的對象的所有授予?postgres中的表的查詢授予
例如,我有表 「MYTABLE」:
GRANT SELECT, INSERT ON mytable TO user1
GRANT UPDATE ON mytable TO user2
我需要財產以後,給了我:
user1: SELECT, INSERT
user2: UPDATE
如何查詢授予postgres中的對象的所有授予?postgres中的表的查詢授予
例如,我有表 「MYTABLE」:
GRANT SELECT, INSERT ON mytable TO user1
GRANT UPDATE ON mytable TO user2
我需要財產以後,給了我:
user1: SELECT, INSERT
user2: UPDATE
我已經找到它:
SELECT grantee, privilege_type
FROM information_schema.role_table_grants
WHERE table_name='mytable'
\z mytable
在psql給你所有從表中的授權,但你那麼必須由個人用戶分割它。
如果你真的想每個用戶一行,您可以通過受贈組(需要PG9 +爲string_agg)
SELECT grantee, string_agg(privilege_type, ', ') AS privileges
FROM information_schema.role_table_grants
WHERE table_name='mytable'
GROUP BY grantee;
這應該輸出類似:
grantee | privileges
---------+----------------
user1 | INSERT, SELECT
user2 | UPDATE
(2 rows)
幾乎我想要的,我可以有像'pg_dump輸出一樣的'GRANT'嗎? – brauliobo
請嘗試以下的查詢。它會給你所有用戶及其在桌面上的權限列表。
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 a.tablename='your_table_name';
這是計算從其他角色的成員身份獲得的權限的唯一答案,因此它可以獲得我的投票。另一方面,我會說'has_table_privilege(usename,contact(schemaname,'。',tablename),...)'以避免含糊不清。 –
加一 - 這是純金! – Daniel
這是一個爲特定表生成授權查詢的腳本。它省略了所有者的權限。
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;
該查詢將列出所有的表中的所有數據庫和模式的(取消對WHERE
子句中的線(或多個)用於過濾特定的數據庫,模式,或表),並在所示的特權爲了使人們很容易看到,如果一個特定的權限授予與否:
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 |
...
你會從SQL窗格或PG命令行直接運行呢? –
@ DanielL.VanDenBosch:所有的元命令,比如'\ z',都是用於psql的。而psql是PostgreSQL的命令行界面。 –