TABLE public.ddl_history (id serial primary key,ddl_ts timestamptz,ddl_user text,ddl_application text,ddl_tg_tag text,ddl_object_identity text);
CREATE FUNCTION test_event_trigger_for_ddl_commands() RETURNS event_trigger LANGUAGE plpgsql AS $$
DECLARE obj record;
BEGIN IF tg_tag <> 'DROP TABLE' THEN
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE object_type IN ('table', 'view')
LOOP INSERT INTO public.ddl_history (ddl_ts,ddl_user,ddl_application,ddl_tg_tag,ddl_object_identity)
VALUES (statement_timestamp(),current_user,current_setting('application_name'),tg_tag,obj.object_identity);
END LOOP;
END IF;
END;
$$;
CREATE EVENT TRIGGER test_event_trigger_for_ddl_commands ON ddl_command_end EXECUTE FUNCTION test_event_trigger_for_ddl_commands();
Понятно что есть проблема с permissions для таблицы public.ddl_history для остальных позователей у кого есть права на создание таблицы если у пользователя нет прав писать в public.ddl_history.
Как можно решить эту задачку?
P.S. идея использовать event trigger для создания обычных triggers в новых таблицах и создания views из вновь созданной таблицы.
SECURITY DEFINER?
SECURITY DEFINER. Если security на самом деле важна, внимательно прочитайте (и тщательно следуйте): https://www.postgresql.org/docs/current/sql-createfunction.html#SQL-CREATEFUNCTION-SECURITY
Спасибо. Судя по тому что прочитал очень страшная вещь. Но действительно решает проблему. Но появится много новых 😁
Возможно ли допустим только grant insert для моей ddl_history таблицы в public схеме для пользователя у которого уже есть права на ddl команды.
Какого именно пользователя (Вы всю схему прав покажите, так ничего непонятно). Но вот это (со стандартными правами до v15): > для моей ddl_history таблицы в public схеме намекает нам, что Вы уже проиграли. ;) "Keep the default search path, and grant privileges to create in the public schema. ... However, this is never a secure pattern."
Обсуждают сегодня