@@ -35,7 +35,7 @@ SELECT obj_type 'TABLE' AS object_type,
3535 r .rolname AS role_name,
3636 t .relnamespace ::regnamespace::name AS schema_name,
3737 t .relname ::text AS object_name,
38- NULL ::name AS subobject_name ,
38+ NULL ::name AS column_name ,
3939 p .perm ::perm_type AS permission,
4040 has_table_privilege(r .oid , t .oid , p .perm ) AS granted
4141FROM pg_catalog .pg_class AS t
@@ -53,7 +53,7 @@ SELECT obj_type 'VIEW' AS object_type,
5353 r .rolname AS role_name,
5454 t .relnamespace ::regnamespace::name AS schema_name,
5555 t .relname ::text AS object_name,
56- NULL ::name AS subobject_name ,
56+ NULL ::name AS column_name ,
5757 p .perm ::perm_type AS permission,
5858 has_table_privilege(r .oid , t .oid , p .perm ) AS granted
5959FROM pg_catalog .pg_class AS t
@@ -71,7 +71,7 @@ SELECT obj_type 'COLUMN' AS object_type,
7171 r .rolname AS role_name,
7272 t .relnamespace ::regnamespace::name AS schema_name,
7373 t .relname ::text AS object_name,
74- c .attname AS subobject_name ,
74+ c .attname AS column_name ,
7575 p .perm ::perm_type AS permission,
7676 has_column_privilege(r .oid , t .oid , c .attnum , p .perm ) AS granted
7777FROM pg_catalog .pg_class AS t
@@ -91,7 +91,7 @@ SELECT obj_type 'SEQUENCE' AS object_type,
9191 r .rolname AS role_name,
9292 t .relnamespace ::regnamespace::name AS schema_name,
9393 t .relname ::text AS object_name,
94- NULL ::name AS subobject_name ,
94+ NULL ::name AS column_name ,
9595 p .perm ::perm_type AS permission,
9696 has_sequence_privilege(r .oid , t .oid , p .perm ) AS granted
9797FROM pg_catalog .pg_class AS t
@@ -109,7 +109,7 @@ SELECT obj_type 'FUNCTION' AS object_type,
109109 r .rolname AS role_name,
110110 f .pronamespace ::regnamespace::name AS schema_name,
111111 f .oid ::regprocedure::text AS object_name,
112- NULL ::name AS subobject_name ,
112+ NULL ::name AS column_name ,
113113 perm_type ' EXECUTE' AS permission,
114114 has_function_privilege(r .oid , f .oid , ' EXECUTE' ) AS granted
115115FROM pg_catalog .pg_proc f
@@ -125,7 +125,7 @@ SELECT obj_type 'SCHEMA' AS object_type,
125125 r .rolname AS role_name,
126126 n .nspname AS schema_name,
127127 NULL ::text AS object_name,
128- NULL ::name AS subobject_name ,
128+ NULL ::name AS column_name ,
129129 p .perm ::perm_type AS permissions,
130130 has_schema_privilege(r .oid , n .oid , p .perm ) AS granted
131131FROM pg_catalog .pg_namespace AS n
@@ -144,7 +144,7 @@ SELECT obj_type 'DATABASE' AS object_type,
144144 r .rolname AS role_name,
145145 NULL ::name AS schema_name,
146146 NULL ::text AS object_name,
147- NULL ::name AS subobject_name ,
147+ NULL ::name AS column_name ,
148148 p .perm ::perm_type AS permissions,
149149 has_database_privilege(r .oid , d .oid , p .perm ) AS granted
150150FROM pg_catalog .pg_database AS d
@@ -181,10 +181,17 @@ CREATE TABLE permission_target (
181181 object_type obj_type NOT NULL ,
182182 schema_name name,
183183 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)
185192);
186193
187- GRANT SELECT ON permission_target TO PUBLIC;
194+ GRANT SELECT , INSERT, UPDATE , DELETE ON permission_target TO PUBLIC;
188195
189196SELECT pg_catalog .pg_extension_config_dump (' permission_target' , ' ' );
190197
@@ -195,7 +202,7 @@ CREATE FUNCTION permission_diffs()
195202 object_type obj_type,
196203 schema_name name,
197204 object_name text ,
198- subobject_name name,
205+ column_name name,
199206 permission perm_type
200207 )
201208 LANGUAGE plpgsql SET search_path FROM CURRENT STABLE AS
@@ -214,18 +221,18 @@ $$DECLARE
214221 ag boolean ;
215222BEGIN
216223 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
218225 FROM permission_target AS pt
219226 CROSS JOIN LATERAL unnest(pt .permissions ) AS p(permission)
220227 LOOP
221228 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
223230 FROM all_permissions AS ap
224231 WHERE ap .object_type = typ
225232 AND ap .permission = p
226233 AND (ap .schema_name = s OR s IS NULL )
227234 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 )
229236 LOOP
230237 IF ar = r AND NOT ag THEN
231238 /* permission not granted that should be */
@@ -234,7 +241,7 @@ BEGIN
234241 permission_diffs .object_type := typ;
235242 permission_diffs .schema_name := a_s;
236243 permission_diffs .object_name := ao;
237- permission_diffs .subobject_name := aso;
244+ permission_diffs .column_name := aso;
238245 permission_diffs .permission := p;
239246 RETURN NEXT;
240247 END IF;
@@ -246,7 +253,7 @@ BEGIN
246253 WHERE pt .role_name = ar
247254 AND (pt .schema_name IS NULL OR pt .schema_name = a_s)
248255 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)
250257 )
251258 THEN
252259 /* extra permission found, report */
@@ -255,7 +262,7 @@ BEGIN
255262 permission_diffs .object_type := typ;
256263 permission_diffs .schema_name := a_s;
257264 permission_diffs .object_name := ao;
258- permission_diffs .subobject_name := aso;
265+ permission_diffs .column_name := aso;
259266 permission_diffs .permission := p;
260267 RETURN NEXT;
261268 END IF;
0 commit comments