感谢劳伦兹的帮助。
我提出了以下解决方案,该解决方案基于 EVENT TRIGGER 和 FUNCTION 与管理员用户拥有的 SECURITY DEFINER 的组合。
EVENT TRIGGER 检测到由 ingester 用户完成的任何 CREATE TABLE,然后调用以 admin 用户权限执行的函数。此函数更改表的所有者,并分别向摄取者和报告用户授予插入和选择权限。摄取者用户现在能够创建表并将数据插入其中。但是这个摄取者不再能够读取、更新或删除这个表。报告用户只能读取表格。
CREATE OR REPLACE FUNCTION trg_create_table_set_owner()
RETURNS event_trigger
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
DECLARE
obj record;
BEGIN
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() WHERE command_tag='CREATE TABLE' LOOP
EXECUTE format('ALTER TABLE %s OWNER TO service_admin', obj.object_identity);
EXECUTE format('GRANT INSERT ON TABLE %s TO ingester_role;', obj.object_identity);
EXECUTE format('GRANT SELECT ON TABLE %s TO reporting_role;', obj.object_identity);
END LOOP;
END;
$$;
CREATE EVENT TRIGGER trg_create_table_set_owner
ON ddl_command_end
WHEN tag IN ('CREATE TABLE')
EXECUTE PROCEDURE trg_create_table_set_owner();