Skip to content

Commit 6c307a7

Browse files
committed
initial commit
0 parents  commit 6c307a7

File tree

1 file changed

+162
-0
lines changed

1 file changed

+162
-0
lines changed

pg_permissions--1.0.sql

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
-- TODO: later in development we will use CREATE EXTENSION
2+
--
3+
-- Documentation:
4+
--
5+
-- this package has been made to give people a quick overview of
6+
-- permissions assigned to people. basically it is a set of view
7+
-- which all have the same structure to make sure that we can
8+
-- query ONE view to fetch all the data at once.
9+
-- it will allow you to fetch ALL information for a user in ONE
10+
-- step easily.
11+
--
12+
-- just run ... SELECT * FROM permissions.all_permissions
13+
-- to figure out.
14+
15+
------------------------------------------------------------------
16+
BEGIN;
17+
18+
CREATE SCHEMA permissions;
19+
20+
SET search_path TO permissions;
21+
22+
CREATE FUNCTION generate_tablename(name, name)
23+
RETURNS text AS
24+
$$
25+
SELECT quote_ident($1) || '.' || quote_ident($2);
26+
$$
27+
LANGUAGE 'sql' IMMUTABLE PARALLEL SAFE;
28+
29+
-- permissions on tables
30+
CREATE VIEW table_permissions AS
31+
WITH list AS (SELECT unnest AS perm
32+
FROM unnest ('{"INSERT", "UPDATE", "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER"}'::text[]))
33+
SELECT 'table' AS object_type,
34+
rolname AS username,
35+
schemaname AS object,
36+
tablename AS sub_object,
37+
NULL::text AS sub_sub_object,
38+
perm_list.perm AS permission,
39+
has_table_privilege(rolname, generate_tablename(schemaname, tablename), perm_list.perm) AS has_permission
40+
FROM pg_tables, pg_authid, LATERAL (SELECT * FROM list) AS perm_list
41+
WHERE schemaname NOT IN ('information_schema', 'pg_catalog')
42+
ORDER BY 1, 2, 3, 4
43+
;
44+
45+
-- permissions on views
46+
CREATE VIEW view_permissions AS
47+
WITH list AS (SELECT unnest AS perm
48+
FROM unnest ('{"INSERT", "UPDATE", "DELETE", "TRIGGER"}'::text[]))
49+
SELECT 'view' AS object_type,
50+
rolname AS username,
51+
schemaname AS object,
52+
viewname AS sub_object,
53+
NULL::text AS sub_sub_object,
54+
perm_list.perm AS permission,
55+
has_table_privilege(rolname, generate_tablename(schemaname, viewname), perm_list.perm) AS has_permission
56+
FROM pg_views, pg_authid, LATERAL (SELECT * FROM list) AS perm_list
57+
WHERE schemaname NOT IN ('information_schema', 'pg_catalog')
58+
ORDER BY 1, 2, 3, 4
59+
;
60+
61+
-- column permissions
62+
CREATE VIEW column_permissions AS
63+
WITH list AS (SELECT unnest AS perm
64+
FROM unnest ('{"SELECT", "INSERT", "UPDATE", "REFERENCES"}'::text[]))
65+
SELECT 'column' AS object_type,
66+
rolname AS username,
67+
schemaname AS object,
68+
tablename AS sub_object,
69+
col.colname::text AS sub_sub_object,
70+
perm_list.perm AS permission,
71+
has_column_privilege(rolname, generate_tablename(schemaname, tablename),
72+
col.colname, perm_list.perm) AS has_permission
73+
FROM (SELECT schemaname, tablename
74+
FROM pg_tables
75+
UNION ALL
76+
SELECT schemaname, viewname
77+
FROM pg_views) AS relations,
78+
pg_authid,
79+
LATERAL (SELECT * FROM list) AS perm_list,
80+
LATERAL (SELECT a.attname AS colname
81+
FROM pg_catalog.pg_attribute a
82+
WHERE a.attrelid = generate_tablename(schemaname, tablename)::regclass::oid
83+
AND a.attnum > 0
84+
AND NOT a.attisdropped
85+
ORDER BY a.attnum
86+
) AS col
87+
WHERE schemaname NOT IN ('information_schema', 'pg_catalog')
88+
ORDER BY 1, 2, 3, 4
89+
;
90+
91+
-- SELECT * FROM column_permissions;
92+
93+
-- permissions on procedures
94+
CREATE VIEW function_permissions AS
95+
SELECT 'function' AS object_type,
96+
rolname AS username,
97+
n.nspname AS object,
98+
p.proname AS sub_object,
99+
pg_catalog.pg_get_function_arguments(p.oid) AS sub_sub_object,
100+
'EXECUTE' AS permission,
101+
has_function_privilege(rolname, p.oid, 'EXECUTE') AS has_permission
102+
FROM pg_catalog.pg_proc p
103+
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace,
104+
LATERAL (SELECT * FROM pg_authid) AS auth
105+
WHERE n.nspname NOT IN ('pg_catalog', 'information_schema')
106+
ORDER BY 1, 2;
107+
108+
-- SELECT * FROM function_permissions;
109+
110+
-- schema permissions
111+
CREATE VIEW schema_permissions AS
112+
WITH list AS (SELECT unnest AS perm
113+
FROM unnest ('{"USAGE", "CREATE"}'::text[]))
114+
SELECT 'schema' AS object_type,
115+
rolname AS username,
116+
n.nspname AS object,
117+
NULL::text AS sub_object,
118+
NULL::text AS sub_sub_object,
119+
perm_list.perm AS permissions,
120+
has_schema_privilege(rolname, n.nspname, perm_list.perm) AS has_permission
121+
FROM pg_catalog.pg_namespace n, pg_authid, list AS perm_list
122+
WHERE n.nspname !~ '^pg_'
123+
AND n.nspname <> 'information_schema'
124+
ORDER BY 1, 2, 3, 4;
125+
126+
-- SELECT * FROM schema_permissions;
127+
128+
-- database permissions
129+
CREATE VIEW database_permissions AS
130+
WITH list AS (SELECT unnest AS perm
131+
FROM unnest ('{"CREATE", "CONNECT", "TEMPORARY"}'::text[]))
132+
SELECT 'database' AS object_type,
133+
rolname AS username,
134+
datname AS object,
135+
NULL::text AS sub_object,
136+
NULL::text AS sub_sub_object,
137+
perm_list.perm AS permissions,
138+
has_database_privilege(rolname, datname, perm_list.perm) AS has_permission
139+
FROM pg_database, pg_authid, list AS perm_list
140+
ORDER BY 1, 2, 3, 4;
141+
142+
-- SELECT * FROM database_permissions;
143+
144+
CREATE VIEW all_permissions
145+
AS
146+
SELECT * FROM table_permissions
147+
UNION ALL
148+
SELECT * FROM view_permissions
149+
UNION ALL
150+
SELECT * FROM column_permissions
151+
UNION ALL
152+
SELECT * FROM function_permissions
153+
UNION ALL
154+
SELECT * FROM schema_permissions
155+
UNION ALL
156+
SELECT * FROM database_permissions
157+
;
158+
159+
-- SELECT * FROM all_permissions;
160+
161+
COMMIT;
162+

0 commit comments

Comments
 (0)