Skip to content

Commit 8c948a3

Browse files
committed
Rename "subobject_name" to "column_name"
1 parent a833fc0 commit 8c948a3

File tree

2 files changed

+24
-20
lines changed

2 files changed

+24
-20
lines changed

README.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@ The extension provides a number of views:
2929
All views have the same columns; a column is NULL if it has no meaning
3030
for the current view.
3131

32-
The `subobject_name` column only has a meaning in `column_permissions`, where
33-
it denotes the column name.
34-
3532
These views can be used to examine the currently granted permissions on
3633
database objects.
3734

@@ -44,7 +41,7 @@ The extension provides a table `permission_target` with which you can describe
4441
the permissions that *should* be granted on database objects.
4542

4643
If you set a relevant column in `permission_target` to NULL (e.g., the
47-
`object_name` and `subobject_name` columns in a `TABLE` entry), the meaning is
44+
`object_name` and `column_name` columns in a `TABLE` entry), the meaning is
4845
that the entry refers to *all* possible objects (in the example above, all
4946
tables in the schema).
5047

pg_permissions--1.0.sql

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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
4141
FROM 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
5959
FROM 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
7777
FROM 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
9797
FROM 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
115115
FROM 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
131131
FROM 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
150150
FROM 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

189196
SELECT 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;
215222
BEGIN
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

Comments
 (0)