38.5. ÐÑÐ¸Ð¼ÐµÑ ÑобÑÑийного ÑÑиггеÑа, обÑабаÑÑваÑÑего пеÑезапиÑÑ ÑаблиÑÑ
ÐлагодаÑÑ ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ ÑобÑÑÐ¸Ñ table_rewrite, можно ÑеализоваÑÑ Ð¿Ð¾Ð»Ð¸ÑÐ¸ÐºÑ Ð¿ÐµÑезапиÑи ÑаблиÑ, допÑÑкаÑÑÑÑ Ð¿ÐµÑезапиÑÑ ÑолÑко в опÑеделÑнное вÑÐµÐ¼Ñ Ð¾Ð±ÑлÑживаниÑ.
СледÑÑÑий пÑÐ¸Ð¼ÐµÑ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑиÑÑÐµÑ ÑеализаÑÐ¸Ñ Ñакой полиÑики.
CREATE OR REPLACE FUNCTION no_rewrite()
RETURNS event_trigger
LANGUAGE plpgsql AS
$$
---
--- РеализаÑÐ¸Ñ Ð»Ð¾ÐºÐ°Ð»Ñной полиÑики пеÑезапиÑи ÑаблиÑ:
--- пеÑезапиÑÑ public.foo не допÑÑкаеÑÑÑ,
--- дÑÑгие ÑаблиÑÑ Ð¼Ð¾Ð³ÑÑ Ð¿ÐµÑезапиÑÑваÑÑÑÑ Ð¼ÐµÐ¶Ð´Ñ 1 ÑаÑом ноÑи и 6 ÑаÑами ÑÑÑа,
--- еÑли ÑолÑко иÑ
ÑÐ°Ð·Ð¼ÐµÑ Ð½Ðµ пÑевÑÑÐ°ÐµÑ 100 блоков
---
DECLARE
table_oid oid := pg_event_trigger_table_rewrite_oid();
current_hour integer := extract('hour' from current_time);
pages integer;
max_pages integer := 100;
BEGIN
IF pg_event_trigger_table_rewrite_oid() = 'public.foo'::regclass
THEN
RAISE EXCEPTION 'you''re not allowed to rewrite the table %',
table_oid::regclass;
END IF;
SELECT INTO pages relpages FROM pg_class WHERE oid = table_oid;
IF pages > max_pages
THEN
RAISE EXCEPTION 'rewrites only allowed for table with less than % pages',
max_pages;
END IF;
IF current_hour NOT BETWEEN 1 AND 6
THEN
RAISE EXCEPTION 'rewrites only allowed between 1am and 6am';
END IF;
END;
$$;
CREATE EVENT TRIGGER no_rewrite_allowed
ON table_rewrite
EXECUTE FUNCTION no_rewrite();