-- Function that reassign the owner of a table to their ownership_role CREATE OR REPLACE FUNCTION @extschema@.CDB_OAuthReassignTableOwnerOnCreation() RETURNS event_trigger AS $$ DECLARE obj record; owner_role text; creator_role text; BEGIN FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() LOOP RAISE DEBUG '% ddl object: % % % %', tg_tag, obj.command_tag, obj.object_type, obj.schema_name, obj.object_identity; IF obj.object_type = 'function' THEN SELECT rolname FROM pg_proc JOIN pg_roles ON proowner = pg_roles.oid WHERE pg_proc.oid = obj.objid INTO creator_role; ELSE SELECT rolname FROM pg_class JOIN pg_roles ON relowner = pg_roles.oid WHERE pg_class.oid = obj.objid INTO creator_role; END IF; SELECT value->>'ownership_role_name' from @extschema@.CDB_Conf_GetConf('api_keys_' || quote_ident(creator_role)) value INTO owner_role; IF owner_role IS NULL OR owner_role = '' THEN RAISE DEBUG 'owner_role not found'; CONTINUE; ELSE EXECUTE 'ALTER ' || obj.object_type || ' ' || obj.object_identity || ' OWNER TO ' || quote_ident(owner_role); IF obj.object_type = 'function' THEN EXECUTE 'GRANT ALL ON FUNCTION ' || obj.object_identity || ' TO ' || QUOTE_IDENT(creator_role); ELSE EXECUTE 'GRANT ALL ON ' || obj.object_identity || ' TO ' || QUOTE_IDENT(creator_role); END IF; RAISE DEBUG 'Changing ownership from % to %', creator_role, owner_role; END IF; END LOOP; END; $$ LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE SECURITY DEFINER SET search_path = pg_temp; -- Creates the trigger on DDL events in order to reassign the owner CREATE OR REPLACE FUNCTION @extschema@.CDB_EnableOAuthReassignTablesTrigger() RETURNS void AS $$ BEGIN DROP EVENT TRIGGER IF EXISTS oauth_reassign_tables_trigger; CREATE EVENT TRIGGER oauth_reassign_tables_trigger ON ddl_command_end WHEN TAG IN ('CREATE TABLE', 'CREATE TABLE AS', 'SELECT INTO', 'CREATE VIEW', 'CREATE FOREIGN TABLE', 'CREATE MATERIALIZED VIEW', 'CREATE SEQUENCE', 'CREATE FUNCTION') EXECUTE PROCEDURE @extschema@.CDB_OAuthReassignTableOwnerOnCreation(); END; $$ LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE; -- Deletes the trigger on DDL events in order to reassign the owner CREATE OR REPLACE FUNCTION @extschema@.CDB_DisableOAuthReassignTablesTrigger() RETURNS void AS $$ BEGIN DROP EVENT TRIGGER IF EXISTS oauth_reassign_tables_trigger; END; $$ LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE;