37.1. ÐÐ±Ð·Ð¾Ñ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° ÑабоÑÑ ÑÑиггеÑов ÑобÑÑий
ТÑÐ¸Ð³Ð³ÐµÑ ÑобÑÑÐ¸Ñ ÑÑабаÑÑÐ²Ð°ÐµÑ Ð²ÑÑкий Ñаз, когда в базе даннÑÑ
, в коÑоÑой он опÑеделÑн, пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÑвÑзанное Ñ Ð½Ð¸Ð¼ ÑобÑÑие. РнаÑÑоÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ ÑледÑÑÑие ÑобÑÑиÑ: ddl_command_start, ddl_command_end, table_rewrite и sql_drop. ÐоддеÑжка дополниÑелÑнÑÑ
ÑобÑÑий Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð° в бÑдÑÑиÑ
вÑпÑÑкаÑ
.
СобÑÑие ddl_command_start пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пеÑед вÑполнением команд CREATE, ALTER, DROP, SECURITY LABEL, COMMENT, GRANT и REVOKE. ÐÑовеÑка на ÑÑÑеÑÑвование обÑекÑа пеÑед ÑÑабаÑÑванием ÑÑиггеÑа не пÑоизводиÑÑÑ. РкаÑеÑÑве иÑклÑÑениÑ, однако, ÑÑо ÑобÑÑие не пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ DDL, обÑаÑаÑÑиÑ
ÑÑ Ðº обÑим обÑекÑам клаÑÑеÑа Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
â базам даннÑÑ
, ÑаблиÑнÑм пÑоÑÑÑанÑÑвам, ÑолÑм, а Ñакже к Ñамим ÑÑиггеÑам ÑобÑÑий. СобÑÑие ddl_command_start Ñакже пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пеÑед вÑполнением ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SELECT INTO, Ñак как она ÑавнознаÑна команде CREATE TABLE AS.
СобÑÑие ddl_command_end пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно поÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ из Ñого же набоÑа. ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± опеÑаÑиÑÑ
DDL, повлÑкÑиÑ
пÑоизоÑедÑее ÑобÑÑие, вÑзовиÑе ÑÑнкÑÐ¸Ñ pg_event_trigger_ddl_commands(), возвÑаÑаÑÑÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво, из кода обÑабоÑÑика ÑобÑÑÐ¸Ñ ddl_command_end (Ñм. Раздел 9.28). ÐамеÑÑÑе, ÑÑо ÑÑÐ¾Ñ ÑÑÐ¸Ð³Ð³ÐµÑ ÑÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾Ñле Ñого, как ÑÑи дейÑÑÐ²Ð¸Ñ Ð¸Ð¼ÐµÐ»Ð¸ меÑÑо (но до ÑикÑаÑии ÑÑанзакÑии), Ñак ÑÑо в ÑиÑÑемнÑÑ
каÑалогаÑ
можно ÑвидеÑÑ Ñже изменÑнное ÑоÑÑоÑние.
СобÑÑие sql_drop пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пеÑед ÑобÑÑием ddl_command_end Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, коÑоÑÑе ÑдалÑÑÑ Ð¾Ð±ÑекÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑпиÑка ÑдалÑннÑÑ
обÑекÑов иÑполÑзÑйÑе возвÑаÑаÑÑÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑÑок ÑÑнкÑÐ¸Ñ pg_event_trigger_dropped_objects() в ÑÑиггеÑе ÑобÑÑÐ¸Ñ sql_drop (Ñм. Раздел 9.28). ÐбÑаÑиÑе внимание, ÑÑо ÑÑÐ¸Ð³Ð³ÐµÑ Ð²ÑполнÑеÑÑÑ Ð¿Ð¾Ñле ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑов из ÑÐ°Ð±Ð»Ð¸Ñ ÑиÑÑемного каÑалога, поÑÑÐ¾Ð¼Ñ Ð¸Ñ
невозможно болÑÑе ÑвидеÑÑ.
СобÑÑие table_rewrite пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÑолÑко поÑле Ñого, как ÑаблиÑа бÑÐ´ÐµÑ Ð¿ÐµÑезапиÑана в ÑезÑлÑÑаÑе опÑеделÑннÑÑ
дейÑÑвий команд ALTER TABLE и ALTER TYPE. ХоÑÑ Ð¿ÐµÑезапиÑÑ ÑаблиÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñзвана и дÑÑгими ÑпÑавлÑÑÑими опеÑаÑоÑами, в ÑаÑÑноÑÑи CLUSTER и VACUUM, ÑобÑÑие table_rewrite Ð´Ð»Ñ Ð½Ð¸Ñ
не вÑзÑваеÑÑÑ.
ТÑиггеÑÑ ÑобÑÑий (как и пÑоÑие ÑÑнкÑии) не могÑÑ Ð²ÑполнÑÑÑÑÑ Ð² пÑеÑванной ÑÑанзакÑии. ÐоÑÑомÑ, еÑли команда DDL завеÑÑаеÑÑÑ Ð¾Ñибкой, ÑооÑвеÑÑÑвÑÑÑие ÑÑиггеÑÑ ddl_command_end не ÑÑабоÑаÑÑ. РнаобоÑоÑ, еÑли ÑÑÐ¸Ð³Ð³ÐµÑ ddl_command_end завеÑÑилÑÑ Ñ Ð¾Ñибкой, поÑледÑÑÑие ÑÑиггеÑÑ ÑобÑÑий не ÑÑабоÑаÑÑ, Ñак же как и Ñама команда не бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ. ÐоÑ
ожим обÑазом, еÑли ÑÑÐ¸Ð³Ð³ÐµÑ ddl_command_end завеÑÑиÑÑÑ Ð¾Ñибкой, дейÑÑвие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ DDL бÑÐ´ÐµÑ Ð¾Ñменено, как ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ñи возникновении оÑибки внÑÑÑи ÑÑанзакÑии.
ÐолнÑй ÑпиÑок команд, коÑоÑÑе поддеÑживаÑÑÑÑ ÑÑиггеÑами ÑобÑÑий, можно найÑи в Разделе 37.2.
ÐÐ»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑиггеÑа ÑобÑÑÐ¸Ñ Ð¸ÑполÑзÑеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° CREATE EVENT TRIGGER. ÐÑедваÑиÑелÑно нÑжно ÑоздаÑÑ ÑÑнкÑиÑ, Ñо ÑпеÑиалÑнÑм возвÑаÑаемÑм Ñипом event_trigger. ÐÐ°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ обÑзана возвÑаÑаÑÑ Ð·Ð½Ð°Ñение (и Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ возвÑаÑаÑÑ). ÐозвÑаÑаемÑй Ñип ÑлÑÐ¶Ð¸Ñ Ð»Ð¸ÑÑ Ñказанием на Ñо, ÑÑо ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð¸Ð· ÑÑиггеÑа ÑобÑÑиÑ.
ÐÑли еÑÑÑ Ð½ÐµÑколÑко ÑÑиггеÑов на одно и Ñо же ÑобÑÑие, Ñо они бÑдÑÑ Ð²ÑзÑваÑÑÑÑ Ð² алÑавиÑном поÑÑдке по имени ÑÑиггеÑа.
РопÑеделении ÑÑиггеÑа можно иÑполÑзоваÑÑ ÑÑловие WHEN, ÑÑобÑ, напÑимеÑ, ÑÑÐ¸Ð³Ð³ÐµÑ ddl_command_start ÑÑабаÑÑвал ÑолÑко Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
команд, коÑоÑÑе нÑжно пеÑеÑ
ваÑиÑÑ. ТÑиггеÑÑ ÑобÑÑий ÑаÑÑо иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° DDL-команд, доÑÑÑпнÑÑ
полÑзоваÑелÑм.