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

Popular posts from this blog

PeopleSoft: Clean Up PUM

Postgres: Clean up stopped replication slot