Skip to content

Commit f9fbfe4

Browse files
committed
feat: log more detail on skipped event triggers
There's not enough explanation on the cause of the skipped event triggers when `supautils.log_skipped_evtrigs` is enabled. Now logs will show the extra DETAIL to solve this: ```sql create table supa_stuff(); NOTICE: Skipping event trigger function "show_current_user" for user "postgres" DETAIL: "postgres" is a superuser and the function "show_current_user" is not superuser-owned, it's owned by "privileged_role" ```
1 parent 5d7d3e5 commit f9fbfe4

File tree

3 files changed

+37
-6
lines changed

3 files changed

+37
-6
lines changed

src/supautils.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,21 @@ static void supautils_fmgr_hook(FmgrHookEventType event, FmgrInfo *flinfo, Datum
101101
// we only need to change behavior before the function gets executed
102102
case FHET_START: {
103103
const char *current_role_name = GetUserNameFromId(GetUserId(), false);
104-
if (superuser() || is_reserved_role(current_role_name, false)) {
105-
bool function_is_owned_by_super = superuser_arg(get_function_owner((func_owner_search){ .as = FO_SEARCH_FINFO, .val.finfo = flinfo }));
104+
const bool role_is_super = superuser();
105+
const bool role_is_reserved = is_reserved_role(current_role_name, false);
106+
if (role_is_super || role_is_reserved) {
107+
Oid func_owner = get_function_owner((func_owner_search){ .as = FO_SEARCH_FINFO, .val.finfo = flinfo });
108+
bool function_is_owned_by_super = superuser_arg(func_owner);
106109
if (!function_is_owned_by_super){
107-
if (log_skipped_evtrigs)
108-
elog(NOTICE, "Skipping event trigger function \"%s\" for user \"%s\"", get_func_name(flinfo->fn_oid), current_role_name);
110+
if (log_skipped_evtrigs){
111+
char *func_name = get_func_name(flinfo->fn_oid);
112+
ereport(
113+
NOTICE,
114+
errmsg("Skipping event trigger function \"%s\" for user \"%s\"", func_name, current_role_name),
115+
errdetail("\"%s\" %s and the function \"%s\" is not superuser-owned, it's owned by \"%s\"",
116+
current_role_name, role_is_super?"is a superuser":"is a reserved role", func_name, GetUserNameFromId(func_owner, false))
117+
);
118+
}
109119
// we can't skip execution directly inside the fmgr_hook (although we can abort it with ereport)
110120
// so instead we use the workaround of changing the event trigger function to a noop function
111121
force_noop(flinfo);

test/expected/event_triggers.out.in

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,27 @@ select count(*) = 1 as only_one_super from pg_roles where rolsuper;
116116
t
117117
(1 row)
118118

119-
-- ensure logging skipped event triggers happens when enabled
119+
-- ensure logging skipped event triggers happens when enabled, for superusers and reserved roles
120120
set supautils.log_skipped_evtrigs = true;
121121
\echo
122122

123123
create table supa_stuff();
124124
NOTICE: Skipping event trigger function "show_current_user" for user "postgres"
125+
DETAIL: "postgres" is a superuser and the function "show_current_user" is not superuser-owned, it's owned by "privileged_role"
125126
NOTICE: Skipping event trigger function "become_super" for user "postgres"
127+
DETAIL: "postgres" is a superuser and the function "become_super" is not superuser-owned, it's owned by "privileged_role"
128+
\echo
129+
130+
set role supabase_storage_admin;
131+
\echo
132+
133+
create table some_stuff();
134+
NOTICE: Skipping event trigger function "show_current_user" for user "supabase_storage_admin"
135+
DETAIL: "supabase_storage_admin" is a reserved role and the function "show_current_user" is not superuser-owned, it's owned by "privileged_role"
136+
NOTICE: Skipping event trigger function "become_super" for user "supabase_storage_admin"
137+
DETAIL: "supabase_storage_admin" is a reserved role and the function "become_super" is not superuser-owned, it's owned by "privileged_role"
138+
\echo
139+
126140
reset supautils.log_skipped_evtrigs;
127141
\echo
128142

test/sql/event_triggers.sql

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,18 @@ set role postgres;
101101
create table super_duper_stuff();
102102
select count(*) = 1 as only_one_super from pg_roles where rolsuper;
103103

104-
-- ensure logging skipped event triggers happens when enabled
104+
-- ensure logging skipped event triggers happens when enabled, for superusers and reserved roles
105105
set supautils.log_skipped_evtrigs = true;
106106
\echo
107107

108108
create table supa_stuff();
109+
\echo
110+
111+
set role supabase_storage_admin;
112+
\echo
113+
114+
create table some_stuff();
115+
\echo
109116

110117
reset supautils.log_skipped_evtrigs;
111118
\echo

0 commit comments

Comments
 (0)