@@ -35,7 +35,7 @@ SELECT obj_type 'TABLE' AS object_type,
35
35
r .rolname AS role_name,
36
36
t .relnamespace ::regnamespace::name AS schema_name,
37
37
t .relname ::text AS object_name,
38
- NULL ::name AS subobject_name ,
38
+ NULL ::name AS column_name ,
39
39
p .perm ::perm_type AS permission,
40
40
has_table_privilege(r .oid , t .oid , p .perm ) AS granted
41
41
FROM pg_catalog .pg_class AS t
@@ -53,7 +53,7 @@ SELECT obj_type 'VIEW' AS object_type,
53
53
r .rolname AS role_name,
54
54
t .relnamespace ::regnamespace::name AS schema_name,
55
55
t .relname ::text AS object_name,
56
- NULL ::name AS subobject_name ,
56
+ NULL ::name AS column_name ,
57
57
p .perm ::perm_type AS permission,
58
58
has_table_privilege(r .oid , t .oid , p .perm ) AS granted
59
59
FROM pg_catalog .pg_class AS t
@@ -71,7 +71,7 @@ SELECT obj_type 'COLUMN' AS object_type,
71
71
r .rolname AS role_name,
72
72
t .relnamespace ::regnamespace::name AS schema_name,
73
73
t .relname ::text AS object_name,
74
- c .attname AS subobject_name ,
74
+ c .attname AS column_name ,
75
75
p .perm ::perm_type AS permission,
76
76
has_column_privilege(r .oid , t .oid , c .attnum , p .perm ) AS granted
77
77
FROM pg_catalog .pg_class AS t
@@ -91,7 +91,7 @@ SELECT obj_type 'SEQUENCE' AS object_type,
91
91
r .rolname AS role_name,
92
92
t .relnamespace ::regnamespace::name AS schema_name,
93
93
t .relname ::text AS object_name,
94
- NULL ::name AS subobject_name ,
94
+ NULL ::name AS column_name ,
95
95
p .perm ::perm_type AS permission,
96
96
has_sequence_privilege(r .oid , t .oid , p .perm ) AS granted
97
97
FROM pg_catalog .pg_class AS t
@@ -109,7 +109,7 @@ SELECT obj_type 'FUNCTION' AS object_type,
109
109
r .rolname AS role_name,
110
110
f .pronamespace ::regnamespace::name AS schema_name,
111
111
f .oid ::regprocedure::text AS object_name,
112
- NULL ::name AS subobject_name ,
112
+ NULL ::name AS column_name ,
113
113
perm_type ' EXECUTE' AS permission,
114
114
has_function_privilege(r .oid , f .oid , ' EXECUTE' ) AS granted
115
115
FROM pg_catalog .pg_proc f
@@ -125,7 +125,7 @@ SELECT obj_type 'SCHEMA' AS object_type,
125
125
r .rolname AS role_name,
126
126
n .nspname AS schema_name,
127
127
NULL ::text AS object_name,
128
- NULL ::name AS subobject_name ,
128
+ NULL ::name AS column_name ,
129
129
p .perm ::perm_type AS permissions,
130
130
has_schema_privilege(r .oid , n .oid , p .perm ) AS granted
131
131
FROM pg_catalog .pg_namespace AS n
@@ -144,7 +144,7 @@ SELECT obj_type 'DATABASE' AS object_type,
144
144
r .rolname AS role_name,
145
145
NULL ::name AS schema_name,
146
146
NULL ::text AS object_name,
147
- NULL ::name AS subobject_name ,
147
+ NULL ::name AS column_name ,
148
148
p .perm ::perm_type AS permissions,
149
149
has_database_privilege(r .oid , d .oid , p .perm ) AS granted
150
150
FROM pg_catalog .pg_database AS d
@@ -181,10 +181,17 @@ CREATE TABLE permission_target (
181
181
object_type obj_type NOT NULL ,
182
182
schema_name name,
183
183
object_name text ,
184
- subobject_name name
184
+ column_name name,
185
+ CHECK (CASE WHEN object_type = ' DATABASE'
186
+ THEN schema_name IS NULL AND object_name IS NULL AND column_name IS NULL
187
+ WHEN object_type = ' SCHEMA'
188
+ THEN object_name IS NULL AND column_name IS NULL
189
+ WHEN object_type IN (' TABLE' , ' VIEW' , ' SEQUENCE' , ' FUNCTION' )
190
+ THEN column_name IS NULL
191
+ END)
185
192
);
186
193
187
- GRANT SELECT ON permission_target TO PUBLIC;
194
+ GRANT SELECT , INSERT, UPDATE , DELETE ON permission_target TO PUBLIC;
188
195
189
196
SELECT pg_catalog .pg_extension_config_dump (' permission_target' , ' ' );
190
197
@@ -195,7 +202,7 @@ CREATE FUNCTION permission_diffs()
195
202
object_type obj_type,
196
203
schema_name name,
197
204
object_name text ,
198
- subobject_name name,
205
+ column_name name,
199
206
permission perm_type
200
207
)
201
208
LANGUAGE plpgsql SET search_path FROM CURRENT STABLE AS
@@ -214,18 +221,18 @@ $$DECLARE
214
221
ag boolean ;
215
222
BEGIN
216
223
FOR r, p, typ, s, o, so IN
217
- SELECT pt .role_name , p .permission , pt .object_type , pt .schema_name , pt .object_name , pt .subobject_name
224
+ SELECT pt .role_name , p .permission , pt .object_type , pt .schema_name , pt .object_name , pt .column_name
218
225
FROM permission_target AS pt
219
226
CROSS JOIN LATERAL unnest(pt .permissions ) AS p(permission)
220
227
LOOP
221
228
FOR ar, a_s, ao, aso, ag IN
222
- SELECT ap .role_name , ap .schema_name , ap .object_name , ap .subobject_name , ap .granted
229
+ SELECT ap .role_name , ap .schema_name , ap .object_name , ap .column_name , ap .granted
223
230
FROM all_permissions AS ap
224
231
WHERE ap .object_type = typ
225
232
AND ap .permission = p
226
233
AND (ap .schema_name = s OR s IS NULL )
227
234
AND (ap .object_name = o OR o IS NULL )
228
- AND (ap .subobject_name = so OR so IS NULL )
235
+ AND (ap .column_name = so OR so IS NULL )
229
236
LOOP
230
237
IF ar = r AND NOT ag THEN
231
238
/* permission not granted that should be */
@@ -234,7 +241,7 @@ BEGIN
234
241
permission_diffs .object_type := typ;
235
242
permission_diffs .schema_name := a_s;
236
243
permission_diffs .object_name := ao;
237
- permission_diffs .subobject_name := aso;
244
+ permission_diffs .column_name := aso;
238
245
permission_diffs .permission := p;
239
246
RETURN NEXT;
240
247
END IF;
@@ -246,7 +253,7 @@ BEGIN
246
253
WHERE pt .role_name = ar
247
254
AND (pt .schema_name IS NULL OR pt .schema_name = a_s)
248
255
AND (pt .object_name IS NULL OR pt .object_name = ao)
249
- AND (pt .subobject_name IS NULL OR pt .subobject_name = aso)
256
+ AND (pt .column_name IS NULL OR pt .column_name = aso)
250
257
)
251
258
THEN
252
259
/* extra permission found, report */
@@ -255,7 +262,7 @@ BEGIN
255
262
permission_diffs .object_type := typ;
256
263
permission_diffs .schema_name := a_s;
257
264
permission_diffs .object_name := ao;
258
- permission_diffs .subobject_name := aso;
265
+ permission_diffs .column_name := aso;
259
266
permission_diffs .permission := p;
260
267
RETURN NEXT;
261
268
END IF;
0 commit comments