9.28. ФÑнкÑии ÑобÑÑийнÑÑ ÑÑиггеÑов
PostgreSQL пÑедоÑÑавлÑÐµÑ ÑледÑÑÑие вÑпомогаÑелÑнÑе ÑÑнкÑии Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии в ÑобÑÑийнÑÑ ÑÑиггеÑÐ°Ñ .
ÐодÑобнее о ÑобÑÑийнÑÑ ÑÑиггеÑÐ°Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑзнаÑÑ Ð² Ðлаве 37.
9.28.1. ÐолÑÑение изменений в конÑе командÑ
ФÑнкÑÐ¸Ñ pg_event_trigger_ddl_commands возвÑаÑÐ°ÐµÑ ÑпиÑок команд DDL, вÑполнÑемÑÑ
в ÑезÑлÑÑаÑе дейÑÑÐ²Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ. ÐÑзÑваÑÑ ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑолÑко в ÑÑнкÑии, ÑеализÑÑÑей ÑобÑÑийнÑй ÑÑÐ¸Ð³Ð³ÐµÑ ddl_command_end. ÐÑи попÑÑке вÑзваÑÑ ÐµÑ Ð² лÑбом дÑÑгом конÑекÑÑе Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка. ФÑнкÑÐ¸Ñ pg_event_trigger_ddl_commands возвÑаÑÐ°ÐµÑ Ð¾Ð´Ð½Ñ ÑÑÑÐ¾ÐºÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ базовой командÑ; Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ
команд, запиÑÑваемÑÑ
в виде одного пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ SQL, Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ Ð½ÐµÑколÑко ÑÑÑок. ÐÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑледÑÑÑие ÑÑолбÑÑ:
| ÐÐ¼Ñ | Тип | ÐпиÑание |
|---|---|---|
classid | oid | OID каÑалога, к коÑоÑÐ¾Ð¼Ñ Ð¾ÑноÑиÑÑÑ Ð¾Ð±ÑÐµÐºÑ |
objid | oid | OID Ñамого обÑекÑа |
objsubid | integer | ÐденÑиÑикаÑÐ¾Ñ Ð¿Ð¾Ð´Ð¾Ð±ÑекÑа (напÑимеÑ, Ð½Ð¾Ð¼ÐµÑ Ð´Ð»Ñ ÑÑолбÑа) |
command_tag | text | Тег ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ |
object_type | text | Тип обÑекÑа |
schema_name | text | ÐÐ¼Ñ ÑÑ
емÑ, к коÑоÑой оÑноÑиÑÑÑ Ð¾Ð±ÑекÑ; еÑли обÑÐµÐºÑ Ð½Ðµ оÑноÑиÑÑÑ Ð½Ð¸ к какой ÑÑ
еме â NULL. РкавÑÑки Ð¸Ð¼Ñ Ð½Ðµ заклÑÑаеÑÑÑ. |
object_identity | text | ТекÑÑовое пÑедÑÑавление иденÑиÑикаÑоÑа обÑекÑа, вклÑÑаÑÑее ÑÑ ÐµÐ¼Ñ. ÐÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи компоненÑÑ ÑÑого иденÑиÑикаÑоÑа заклÑÑаÑÑÑÑ Ð² кавÑÑки. |
in_extension | bool | True, еÑли команда ÑвлÑеÑÑÑ ÑаÑÑÑÑ ÑкÑипÑа ÑаÑÑиÑÐµÐ½Ð¸Ñ |
command | pg_ddl_command | Ðолное пÑедÑÑавление командÑ, во внÑÑÑеннем ÑоÑмаÑе. Ðго нелÑÐ·Ñ Ð²ÑвеÑÑи непоÑÑедÑÑвенно, но можно пеÑедаÑÑ Ð´ÑÑгим ÑÑнкÑиÑм, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑазлиÑнÑе ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ команде. |
9.28.2. ÐбÑабоÑка обÑекÑов, ÑдалÑннÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ DDL
ФÑнкÑÐ¸Ñ pg_event_trigger_dropped_objects возвÑаÑÐ°ÐµÑ ÑпиÑок вÑеÑ
обÑекÑов, ÑдалÑннÑÑ
командой, вÑзвавÑей ÑобÑÑие sql_drop. ÐÑи вÑзове в дÑÑгом конÑекÑÑе pg_event_trigger_dropped_objects вÑдаÑÑ Ð¾ÑибкÑ. pg_event_trigger_dropped_objects возвÑаÑÐ°ÐµÑ ÑледÑÑÑие ÑÑолбÑÑ:
| ÐÐ¼Ñ | Тип | ÐпиÑание |
|---|---|---|
classid | oid | OID каÑалога, к коÑоÑÐ¾Ð¼Ñ Ð¾ÑноÑилÑÑ Ð¾Ð±ÑÐµÐºÑ |
objid | oid | OID Ñамого обÑекÑа |
objsubid | integer | ÐденÑиÑикаÑÐ¾Ñ Ð¿Ð¾Ð´Ð¾Ð±ÑекÑа (напÑимеÑ, Ð½Ð¾Ð¼ÐµÑ Ð´Ð»Ñ ÑÑолбÑа) |
original | bool | True, еÑли ÑÑо один из коÑневÑÑ ÑдалÑемÑÑ Ð¾Ð±ÑекÑов |
normal | bool | True, еÑли к ÑÑÐ¾Ð¼Ñ Ð¾Ð±ÑекÑÑ Ð² гÑаÑе завиÑимоÑÑей пÑивело оÑноÑение обÑÑной завиÑимоÑÑи |
is_temporary | bool | True, еÑли обÑÐµÐºÑ Ð±Ñл вÑеменнÑм |
object_type | text | Тип обÑекÑа |
schema_name | text | ÐÐ¼Ñ ÑÑ
емÑ, к коÑоÑой оÑноÑилÑÑ Ð¾Ð±ÑекÑ; еÑли обÑÐµÐºÑ Ð½Ðµ оÑноÑилÑÑ Ð½Ð¸ к какой ÑÑ
еме â NULL. РкавÑÑки Ð¸Ð¼Ñ Ð½Ðµ заклÑÑаеÑÑÑ. |
object_name | text | ÐÐ¼Ñ Ð¾Ð±ÑекÑа, еÑли ÑоÑеÑание ÑÑ
ÐµÐ¼Ñ Ð¸ имени позволÑÐµÑ ÑникалÑно иденÑиÑиÑиÑоваÑÑ Ð¾Ð±ÑекÑ; в пÑоÑивном ÑлÑÑае â NULL. ÐÐ¼Ñ Ð½Ðµ заклÑÑаеÑÑÑ Ð² кавÑÑки и не дополнÑеÑÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑÑ
емÑ. |
object_identity | text | ТекÑÑовое пÑедÑÑавление иденÑиÑикаÑоÑа обÑекÑа, вклÑÑаÑÑее ÑÑ ÐµÐ¼Ñ. ÐÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи компоненÑÑ ÑÑого иденÑиÑикаÑоÑа заклÑÑаÑÑÑÑ Ð² кавÑÑки. |
address_names | text[] | ÐаÑÑив, коÑоÑÑй в ÑоÑеÑании Ñ object_type и маÑÑивом address_args можно пеÑедаÑÑ ÑÑнкÑии pg_get_object_address(), ÑÑÐ¾Ð±Ñ Ð²Ð¾ÑÑоздаÑÑ Ð°Ð´ÑÐµÑ Ð¾Ð±ÑекÑа на ÑдалÑнном ÑеÑвеÑе, ÑодеÑжаÑем одноимÑннÑй обÑÐµÐºÑ Ñого же Ñода. |
address_args | text[] | Ðополнение к маÑÑÐ¸Ð²Ñ address_names |
ФÑнкÑÐ¸Ñ pg_event_trigger_dropped_objects можно иÑполÑзоваÑÑ Ð² ÑобÑÑийном ÑÑиггеÑе Ñак:
CREATE FUNCTION test_event_trigger_for_drops()
RETURNS event_trigger LANGUAGE plpgsql AS $$
DECLARE
obj record;
BEGIN
FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects()
LOOP
RAISE NOTICE '% dropped object: % %.% %',
tg_tag,
obj.object_type,
obj.schema_name,
obj.object_name,
obj.object_identity;
END LOOP;
END;
$$;
CREATE EVENT TRIGGER test_event_trigger_for_drops
ON sql_drop
EXECUTE PROCEDURE test_event_trigger_for_drops();9.28.3. ÐбÑабоÑка ÑобÑÑÐ¸Ñ Ð¿ÐµÑезапиÑи ÑаблиÑÑ
РТаблиÑе 9.78 Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ ÑÑнкÑии, вÑдаÑÑие инÑоÑмаÑÐ¸Ñ Ð¾ ÑаблиÑе, Ð´Ð»Ñ ÐºÐ¾ÑоÑой пÑоизоÑло ÑобÑÑие пеÑезапиÑи ÑаблиÑÑ (table_rewrite). ÐÑи попÑÑке вÑзваÑÑ Ð¸Ñ
в дÑÑгом конÑекÑÑе Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка.
ТаблиÑа 9.78. ÐнÑоÑмаÑÐ¸Ñ Ð¾ пеÑезапиÑи ÑаблиÑÑ
ФÑнкÑÐ¸Ñ pg_event_trigger_table_rewrite_oid можно иÑполÑзоваÑÑ Ð² ÑобÑÑийном ÑÑиггеÑе Ñак:
CREATE FUNCTION test_event_trigger_table_rewrite_oid()
RETURNS event_trigger
LANGUAGE plpgsql AS
$$
BEGIN
RAISE NOTICE 'rewriting table % for reason %',
pg_event_trigger_table_rewrite_oid()::regclass,
pg_event_trigger_table_rewrite_reason();
END;
$$;
CREATE EVENT TRIGGER test_table_rewrite_oid
ON table_rewrite
EXECUTE PROCEDURE test_event_trigger_table_rewrite_oid();