-- B09:索引现有条目和头的事务变更守卫;不产生第二套索引或业务权威。 CREATE TABLE public.muse_method_index_guard ( singleton boolean PRIMARY KEY DEFAULT true CHECK (singleton), generation bigint NOT NULL DEFAULT 0 CHECK (generation >= 0) ); INSERT INTO public.muse_method_index_guard (singleton, generation) VALUES (true, 0); CREATE FUNCTION public.muse_method_index_changed() RETURNS trigger LANGUAGE plpgsql SECURITY DEFINER SET search_path = pg_catalog AS $guard$ BEGIN UPDATE public.muse_method_index_guard SET generation = generation + 1 WHERE singleton; IF NOT FOUND THEN RAISE EXCEPTION 'method index mutation guard is missing'; END IF; RETURN NULL; END $guard$; -- statement 级别也覆盖批量改写和 TRUNCATE;事务失败时代次一并回滚。 CREATE TRIGGER muse_method_index_changed AFTER INSERT OR UPDATE OR DELETE OR TRUNCATE ON public.muse_method_index FOR EACH STATEMENT EXECUTE FUNCTION public.muse_method_index_changed(); CREATE TRIGGER muse_method_index_head_changed AFTER INSERT OR UPDATE OR DELETE OR TRUNCATE ON public.muse_method_index_version FOR EACH STATEMENT EXECUTE FUNCTION public.muse_method_index_changed(); REVOKE ALL ON public.muse_method_index_guard FROM PUBLIC, muse_app, muse_eval; GRANT SELECT ON public.muse_method_index_guard TO muse_app, muse_eval; REVOKE ALL ON FUNCTION public.muse_method_index_changed() FROM PUBLIC;