[PATCH] pg_ownerships system view
Hi,
Attached is a suggestion of adding a convenience view,
allowing quickly looking up all objects owned by a given user.
Example:
SELECT * FROM ownerships WHERE rolname = 'joel' LIMIT 5;
regclass | obj_desc | rolname
------------------+-----------------------------------+---------
pg_class | table t | joel
pg_class | table foobar.foobar_policed_table | joel
pg_class | view ownerships | joel
pg_collation | collation foobar.foobar | joel
pg_event_trigger | event trigger foobar | joel
(5 rows)
This is similar to the suggested pg_permissions system view in other thread.
/Joel
Attachments:
0002-pg_ownerships.patchapplication/octet-stream; name=0002-pg_ownerships.patchDownload
diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql
index 52732158db..fd4ad85db2 100644
--- a/src/backend/catalog/system_views.sql
+++ b/src/backend/catalog/system_views.sql
@@ -769,8 +769,179 @@ UNION ALL
FROM pg_catalog.pg_type AS aa
) AS a
JOIN pg_catalog.pg_authid AS grantor ON grantor.oid = a.grantor
- JOIN pg_catalog.pg_authid AS grantee ON grantee.oid = a.grantee
-;
+ JOIN pg_catalog.pg_authid AS grantee ON grantee.oid = a.grantee;
+
+CREATE VIEW pg_ownerships AS
+ SELECT
+ 'pg_class'::regclass
+ AS regclass,
+ pg_describe_object('pg_class'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_class AS aa
+ JOIN pg_catalog.pg_authid ON aa.relowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_collation'::regclass
+ AS regclass,
+ pg_describe_object('pg_collation'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_collation AS aa
+ JOIN pg_catalog.pg_authid ON aa.collowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_conversion'::regclass
+ AS regclass,
+ pg_describe_object('pg_conversion'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_conversion AS aa
+ JOIN pg_catalog.pg_authid ON aa.conowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_event_trigger'::regclass
+ AS regclass,
+ pg_describe_object('pg_event_trigger'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_event_trigger AS aa
+ JOIN pg_catalog.pg_authid ON aa.evtowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_extension'::regclass
+ AS regclass,
+ pg_describe_object('pg_extension'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_extension AS aa
+ JOIN pg_catalog.pg_authid ON aa.extowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_foreign_data_wrapper'::regclass
+ AS regclass,
+ pg_describe_object('pg_foreign_data_wrapper'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_foreign_data_wrapper AS aa
+ JOIN pg_catalog.pg_authid ON aa.fdwowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_foreign_server'::regclass
+ AS regclass,
+ pg_describe_object('pg_foreign_server'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_foreign_server AS aa
+ JOIN pg_catalog.pg_authid ON aa.srvowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_language'::regclass
+ AS regclass,
+ pg_describe_object('pg_language'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_language AS aa
+ JOIN pg_catalog.pg_authid ON aa.lanowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_namespace'::regclass
+ AS regclass,
+ pg_describe_object('pg_namespace'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_namespace AS aa
+ JOIN pg_catalog.pg_authid ON aa.nspowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_opclass'::regclass
+ AS regclass,
+ pg_describe_object('pg_opclass'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_opclass AS aa
+ JOIN pg_catalog.pg_authid ON aa.opcowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_operator'::regclass
+ AS regclass,
+ pg_describe_object('pg_operator'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_operator AS aa
+ JOIN pg_catalog.pg_authid ON aa.oprowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_opfamily'::regclass
+ AS regclass,
+ pg_describe_object('pg_opfamily'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_opfamily AS aa
+ JOIN pg_catalog.pg_authid ON aa.opfowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_policy'::regclass
+ AS regclass,
+ pg_describe_object('pg_policy'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_policy AS aa
+ JOIN pg_catalog.pg_authid ON pg_authid.oid = ANY(aa.polroles)
+UNION ALL
+ SELECT
+ 'pg_proc'::regclass
+ AS regclass,
+ pg_describe_object('pg_proc'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_proc AS aa
+ JOIN pg_catalog.pg_authid ON aa.proowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_statistic_ext'::regclass
+ AS regclass,
+ pg_describe_object('pg_statistic_ext'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_statistic_ext AS aa
+ JOIN pg_catalog.pg_authid ON aa.stxowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_tablespace'::regclass
+ AS regclass,
+ pg_describe_object('pg_tablespace'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_tablespace AS aa
+ JOIN pg_catalog.pg_authid ON aa.spcowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_ts_config'::regclass
+ AS regclass,
+ pg_describe_object('pg_ts_config'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_ts_config AS aa
+ JOIN pg_catalog.pg_authid ON aa.cfgowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_ts_dict'::regclass
+ AS regclass,
+ pg_describe_object('pg_ts_dict'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_ts_dict AS aa
+ JOIN pg_catalog.pg_authid ON aa.dictowner = pg_authid.oid
+UNION ALL
+ SELECT
+ 'pg_type'::regclass
+ AS regclass,
+ pg_describe_object('pg_type'::regclass,aa.oid,0)
+ AS obj_desc,
+ pg_authid.rolname
+ FROM pg_catalog.pg_type AS aa
+ JOIN pg_catalog.pg_authid ON aa.typowner = pg_authid.oid;
CREATE VIEW pg_settings AS
SELECT * FROM pg_show_all_settings() AS A;
On 3/7/21 1:08 AM, Joel Jacobson wrote:
Attached is a suggestion of adding a convenience view,
allowing quickly looking up all objects owned by a given user.
This definitely seems like a useful feature. I know I am guilty of
creating tables as the wrong role more than one time.
Andreas