Postgres: which roles (users or groups) have been granted EXECUTE privileges on a stored procedure (or function)
-- Replace 'schema_name', 'procedure_name', and argument types as needed
SELECT
r.rolname AS role_name,
p.proname AS procedure_name,
n.nspname AS schema_name,
pg_get_function_identity_arguments(p.oid) AS arguments,
has_function_privilege(r.rolname, p.oid, 'EXECUTE') AS can_execute
FROM
pg_proc p
JOIN
pg_namespace n ON n.oid = p.pronamespace
JOIN
pg_roles r ON has_function_privilege(r.rolname, p.oid, 'EXECUTE')
WHERE
n.nspname = 'public' -- schema name
AND p.proname = 'my_procedure' -- procedure name
-- Optional: match argument types if overloaded
-- AND pg_get_function_identity_arguments(p.oid) = 'integer, text'
ORDER BY
role_name;
How it works:
pg_proc— stores all functions and procedures.pg_namespace— stores schema names.pg_roles— stores all roles (users/groups).has_function_privilege()— checks if a role has a specific privilege (here,EXECUTE).pg_get_function_identity_arguments()— helps distinguish overloaded procedures.
Comments
Post a Comment