37.1. ÐÐ±Ð·Ð¾Ñ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° ÑабоÑÑ ÑÑиггеÑов
ТÑÐ¸Ð³Ð³ÐµÑ ÑвлÑеÑÑÑ Ñказанием, ÑÑо база даннÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° авÑомаÑиÑеÑки вÑполниÑÑ Ð·Ð°Ð´Ð°Ð½Ð½ÑÑ ÑÑнкÑиÑ, вÑÑкий Ñаз когда вÑполнен опÑеделÑннÑй Ñип опеÑаÑии. ТÑиггеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ñ ÑаблиÑами (ÑекÑиониÑованнÑми и обÑÑнÑми), Ñ Ð¿ÑедÑÑавлениÑми и Ñ Ð²Ð½ÐµÑними ÑаблиÑами.
ÐÐ»Ñ Ð¾Ð±ÑÑнÑÑ
и ÑÑоÑонниÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ опÑеделÑÑÑ ÑÑиггеÑÑ, коÑоÑÑе бÑдÑÑ ÑÑабаÑÑваÑÑ Ð´Ð¾ или поÑле лÑбой из команд INSERT, UPDATE или DELETE; либо один Ñаз Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ модиÑиÑиÑÑемой ÑÑÑоки, либо один Ñаз Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа SQL. ТÑиггеÑÑ Ð½Ð° UPDATE можно ÑÑÑановиÑÑ Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ ÑÑабаÑÑвали, ÑолÑко когда в пÑедложении SET опеÑаÑоÑа UPDATE ÑпоминаÑÑÑÑ Ð¾Ð¿ÑеделÑннÑе ÑÑолбÑÑ. Также ÑÑиггеÑÑ Ð¼Ð¾Ð³ÑÑ ÑÑабаÑÑваÑÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑов TRUNCATE. ÐÑли пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÑобÑÑие ÑÑиггеÑа, Ð´Ð»Ñ Ð¾Ð±ÑабоÑки ÑÑого ÑобÑÑÐ¸Ñ Ð² ÑÑÑановленнÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени вÑзÑваеÑÑÑ ÑÑнкÑÐ¸Ñ ÑÑиггеÑа.
ÐÐ»Ñ Ð¿ÑедÑÑавлений ÑÑиггеÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ð¼ÐµÑÑо опеÑаÑий INSERT, UPDATE и DELETE. Такие ÑÑиггеÑÑ INSTEAD OF вÑзÑваÑÑÑÑ ÐµÐ´Ð¸Ð½Ð¾Ð¶Ð´Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки, коÑоÑÐ°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð° в ÑÑом пÑедÑÑавлении. Ðменно ÑÑнкÑÐ¸Ñ ÑÑиггеÑа оÑвеÑÐ°ÐµÑ Ð·Ð° Ñо, ÑÑÐ¾Ð±Ñ Ð¿ÑоизвеÑÑи необÑ
одимÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² нижележаÑиÑ
базовÑÑ
ÑаблиÑаÑ
пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ должнÑм обÑазом возвÑаÑаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑннÑе ÑÑÑоки, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ поÑвлÑлиÑÑ Ð² пÑедÑÑавлении. ТÑиггеÑÑ Ð´Ð»Ñ Ð¿ÑедÑÑавлений Ñоже могÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ñак, ÑÑо они бÑдÑÑ Ð²ÑполнÑÑÑÑÑ ÐµÐ´Ð¸Ð½Ð¾Ð¶Ð´Ñ Ð´Ð»Ñ Ð²Ñего опеÑаÑоÑа SQL, до или поÑле опеÑаÑий INSERT, UPDATE или DELETE. Ðднако Ñакие ÑÑиггеÑÑ ÑÑабаÑÑваÑÑ, ÑолÑко еÑли Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑеделÑн ÑÑÐ¸Ð³Ð³ÐµÑ INSTEAD OF. РпÑоÑивном ÑлÑÑае вÑе опеÑаÑоÑÑ, обÑаÑаÑÑиеÑÑ Ðº пÑедÑÑавлениÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿ÐµÑепиÑÐ°Ð½Ñ Ð² виде опеÑаÑоÑов, обÑаÑаÑÑиÑ
ÑÑ Ðº нижележаÑим базовÑм ÑаблиÑам, и Ñогда бÑдÑÑ ÑÑабаÑÑваÑÑ ÑÑиггеÑÑ, ÑÑÑановленнÑе Ð´Ð»Ñ ÑÑиÑ
ÑаблиÑ.
ТÑиггеÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ñоздана до ÑÑиггеÑа. Ðна должна бÑÑÑ Ð¾Ð±ÑÑвлена без аÑгÑменÑов и возвÑаÑаÑÑ Ñип trigger. (ТÑиггеÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð´Ð°Ð½Ð½Ñе на вÑ
од поÑÑедÑÑвом ÑпеÑиалÑно пеÑеданной ÑÑÑÑкÑÑÑÑ TriggerData, а не в ÑоÑме обÑÑнÑÑ
аÑгÑменÑов.)
ÐоÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑиггеÑной ÑÑнкÑии ÑоздаÑÑÑÑ ÑÑÐ¸Ð³Ð³ÐµÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CREATE TRIGGER. Ðдна и Ñа же ÑÑиггеÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзована Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑиггеÑов.
Postgres Pro пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ ÐºÐ°Ðº поÑÑÑоÑнÑе, Ñак и опеÑаÑоÑнÑе ÑÑиггеÑÑ. Ð ÑлÑÑае поÑÑÑоÑного ÑÑиггеÑа ÑÑиггеÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²ÑзÑваеÑÑÑ Ð¾Ð´Ð¸Ð½ Ñаз Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки, заÑÑонÑÑой опеÑаÑоÑом, запÑÑÑивÑим ÑÑиггеÑ. ÐпеÑаÑоÑнÑй же ÑÑиггеÑ, напÑоÑив, вÑзÑваеÑÑÑ ÑолÑко один Ñаз пÑи вÑполнении ÑооÑвеÑÑÑвÑÑÑего опеÑаÑоÑа, незавиÑимо Ð¾Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑва ÑÑÑок, коÑоÑÑе он заÑÑагиваеÑ. Ð ÑаÑÑноÑÑи опеÑаÑоÑ, коÑоÑÑй не заÑÑÐ°Ð³Ð¸Ð²Ð°ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
ÑÑÑок, вÑÑ Ñавно пÑиведÑÑ Ðº ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑного ÑÑиггеÑа. ÐÑи два Ñипа ÑÑиггеÑов Ñакже назÑваÑÑ ÑÑиггеÑами ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок и ÑÑиггеÑами ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа, ÑооÑвеÑÑÑвенно. ТÑиггеÑÑ Ð½Ð° TRUNCATE могÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑолÑко на ÑÑовне опеÑаÑоÑа, а не на ÑÑовне ÑÑÑок.
ТÑиггеÑÑ Ñакже клаÑÑиÑиÑиÑÑÑÑÑÑ Ð² ÑооÑвеÑÑÑвии Ñ Ñем, ÑÑабаÑÑваÑÑ Ð»Ð¸ они до, поÑле или вмеÑÑо опеÑаÑии. Ðни назÑваÑÑÑÑ ÑÑиггеÑами BEFORE, AFTER и INSTEAD OF, ÑооÑвеÑÑÑвенно. ТÑиггеÑÑ BEFORE ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа ÑÑабаÑÑваÑÑ Ð´Ð¾ Ñого, как опеÑаÑÐ¾Ñ Ð½Ð°ÑÐ¸Ð½Ð°ÐµÑ Ð´ÐµÐ»Ð°ÑÑ ÑÑо-либо, Ñогда как ÑÑиггеÑÑ AFTER ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа ÑÑабаÑÑваÑÑ Ð² Ñамом конÑе ÑабоÑÑ Ð¾Ð¿ÐµÑаÑоÑа. ÐÑи ÑÐ¸Ð¿Ñ ÑÑиггеÑов могÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð´Ð»Ñ ÑаблиÑ, пÑедÑÑавлений или ÑÑоÑонниÑ
ÑаблиÑ. ТÑиггеÑÑ BEFORE ÑÑÐ¾Ð²Ð½Ñ ÑÑÑоки ÑÑабаÑÑваÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пеÑед обÑабоÑкой конкÑеÑной ÑÑÑоки, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº ÑÑиггеÑÑ AFTER ÑÑÐ¾Ð²Ð½Ñ ÑÑÑоки ÑÑабаÑÑваÑÑ Ð² конÑе ÑабоÑÑ Ð²Ñего опеÑаÑоÑа (но до лÑбого из ÑÑиггеÑов AFTER ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа). ÐÑи ÑÐ¸Ð¿Ñ ÑÑиггеÑов могÑÑ Ð¾Ð¿ÑеделÑÑÑÑÑ ÑолÑко Ð´Ð»Ñ ÑаблиÑ, в Ñом ÑиÑле ÑÑоÑонниÑ
, но не Ð´Ð»Ñ Ð¿ÑедÑÑавлений. ТÑиггеÑÑ INSTEAD OF могÑÑ Ð¾Ð¿ÑеделÑÑÑÑÑ ÑолÑко Ð´Ð»Ñ Ð¿ÑедÑÑавлений и ÑолÑко на ÑÑовне ÑÑÑок: они ÑÑабаÑÑваÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле Ñого как ÑÑÑока пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑиÑиÑована как подлежаÑÐ°Ñ Ð¾Ð±ÑабоÑке.
ÐпеÑаÑоÑ, наÑеленнÑй на ÑодиÑелÑÑкÑÑ ÑаблиÑÑ Ð² иеÑаÑÑ Ð¸Ð¸ наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ ÑекÑиониÑованиÑ, не вÑзÑÐ²Ð°ÐµÑ ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ ÑÑиггеÑов ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа Ð´Ð»Ñ Ð·Ð°Ð´ÐµÐ¹ÑÑвованнÑÑ Ð´Ð¾ÑеÑÐ½Ð¸Ñ ÑаблиÑ; ÑÑабаÑÑваÑÑ Ð±ÑдÑÑ ÑолÑко Ñакие ÑÑиггеÑÑ Ð´Ð»Ñ ÑодиÑелÑÑкой ÑаблиÑÑ. Ðднако еÑли Ð´Ð»Ñ ÑÑÐ¸Ñ Ð´Ð¾ÑеÑÐ½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ ÑÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок, они бÑдÑÑ ÑÑабаÑÑваÑÑ.
ÐÑли запÑÐ¾Ñ INSERT ÑодеÑÐ¶Ð¸Ñ Ð¿Ñедложение ON CONFLICT DO UPDATE, возможно ÑовмеÑÑное пÑименение и ÑÑиггеÑов ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок BEFORE INSERT, и ÑÑиггеÑов ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок BEFORE UPDATE, коÑоÑое оÑÑазиÑÑÑ Ð² оконÑаÑелÑном ÑоÑÑоÑнии изменÑемой ÑÑÑоки, еÑли в запÑоÑе задейÑÑвÑÑÑÑÑ ÑÑолбÑÑ EXCLUDED. ÐÑи ÑÑом обÑаÑение к EXCLUDED не обÑзаÑелÑно должно имеÑÑ Ð¼ÐµÑÑо в обоиÑ
набоÑаÑ
ÑÑиггеÑов BEFORE на ÑÑовне ÑÑÑок. СледÑÐµÑ ÑаÑÑмоÑÑеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑезÑлÑÑаÑа, когда имеÑÑÑÑ Ð¸ ÑÑиггеÑÑ BEFORE INSERT, и BEFORE UPDATE на ÑÑовне ÑÑÑоки, и они вмеÑÑе модиÑиÑиÑÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑемÑÑ/изменÑемÑÑ ÑÑÑÐ¾ÐºÑ (пÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ, даже еÑли Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ или менее ÑавнознаÑнÑе, но пÑи ÑÑом не идемпоÑенÑнÑе). ÐамеÑÑÑе, ÑÑо ÑÑиггеÑÑ UPDATE ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа вÑзÑваÑÑÑÑ Ð¿Ñи ON CONFLICT DO UPDATE незавиÑимо Ð¾Ñ Ñого, бÑдÑÑ Ð»Ð¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ ÐºÐ°ÐºÐ¸Ðµ-либо ÑÑÑоки в ÑезÑлÑÑаÑе UPDATE (и даже в ÑлÑÑае, когда алÑÑеÑнаÑивнÑй пÑÑÑ UPDATE вообÑе не вÑбиÑаеÑÑÑ). ÐÑи вÑполнении запÑоÑа INSERT Ñ Ð¿Ñедложением ON CONFLICT DO UPDATE ÑнаÑала вÑполнÑÑÑÑÑ ÑÑиггеÑÑ BEFORE INSERT, заÑем ÑÑиггеÑÑ BEFORE UPDATE, поÑом ÑÑиггеÑÑ AFTER UPDATE и, наконеÑ, AFTER INSERT (ÑеÑÑ Ð¸Ð´ÑÑ Ð¾ ÑÑиггеÑаÑ
на ÑÑовне опеÑаÑоÑов).
ÐÑли опеÑаÑÐ¾Ñ UPDATE в ÑекÑиониÑованной ÑаблиÑе должен пеÑемеÑÑиÑÑ ÑÑÑÐ¾ÐºÑ Ð² дÑÑгÑÑ ÑекÑиÑ, ÑÑо пеÑемеÑение ÑеализÑеÑÑÑ Ð² ÑезÑлÑÑаÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ DELETE в иÑÑ
одной ÑекÑии и поÑледÑÑÑего INSERT в новой ÑекÑии. ÐÑи ÑÑом в иÑÑ
одной ÑекÑии ÑÑабаÑÑваÑÑ Ð²Ñе ÑÑиггеÑÑ BEFORE UPDATE и BEFORE DELETE ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок. ÐаÑем в Ñелевой ÑекÑии ÑÑабаÑÑваÑÑ Ð²Ñе ÑÑиггеÑÑ BEFORE INSERT ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок. СледÑÐµÑ Ð¸Ð¼ÐµÑÑ Ð² видÑ, ÑÑо в ÑлÑÑаÑÑ
, когда вÑе ÑÑи ÑÑиггеÑÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑÑÑÑ Ð¿ÐµÑемеÑаемÑÑ ÑÑÑокÑ, полÑÑеннÑй ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ñм. ÐÑли ÑаÑÑмаÑÑиваÑÑ ÑÑиггеÑÑ AFTER ROW, Ñо пÑименÑÑÑÑÑ Ð±ÑдÑÑ ÑÑиггеÑÑ AFTER DELETE и AFTER INSERT, но не ÑÑиггеÑÑ AFTER UPDATE, Ñак как команда UPDATE заменÑеÑÑÑ Ð½Ð° DELETE и INSERT. ÐÑли же ÑаÑÑмаÑÑиваÑÑ ÑÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑов, ни ÑÑиггеÑÑ DELETE, ни ÑÑиггеÑÑ INSERT не бÑдÑÑ ÑÑабаÑÑваÑÑ, даже еÑли пÑоизводиÑÑÑ Ð¿ÐµÑемеÑение ÑÑÑок; ÑÑабоÑаÑÑ ÑолÑко ÑÑиггеÑÑ UPDATE, ÑÑÑановленнÑе в Ñелевой ÑаблиÑе опеÑаÑоÑа UPDATE.
ТÑиггеÑнÑе ÑÑнкÑии, вÑзÑваемÑе ÑÑиггеÑами опеÑаÑоÑов, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ñегда возвÑаÑаÑÑ NULL. ТÑиггеÑнÑе ÑÑнкÑии, вÑзÑваемÑе ÑÑиггеÑами ÑÑÑок, могÑÑ Ð²ÐµÑнÑÑÑ ÑÑÑÐ¾ÐºÑ ÑаблиÑÑ (знаÑение Ñипа HeapTuple). У ÑÑиггеÑа ÑÑÐ¾Ð²Ð½Ñ ÑÑÑоки, ÑÑабаÑÑваÑÑего до опеÑаÑии, еÑÑÑ ÑледÑÑÑий вÑбоÑ:
Ðожно веÑнÑÑÑ
NULL, ÑÑÐ¾Ð±Ñ Ð¿ÑопÑÑÑиÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð´Ð»Ñ ÑекÑÑей ÑÑÑоки. ÐÑо ÑказÑÐ²Ð°ÐµÑ Ð¸ÑполниÑÐµÐ»Ñ Ð·Ð°Ð¿ÑоÑов, ÑÑо не нÑжно вÑполнÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ñо ÑÑÑокой вÑзвавÑей ÑÑÐ¸Ð³Ð³ÐµÑ (вÑÑавкÑ, изменение или Ñдаление конкÑеÑной ÑÑÑоки в ÑаблиÑе).ÐозвÑаÑÐ°ÐµÐ¼Ð°Ñ ÑÑÑока Ð´Ð»Ñ ÑÑиггеÑов
INSERTилиUPDATEбÑÐ´ÐµÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ Ñой, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑÑавлена или обновлена в ÑаблиÑе. ÐÑо позволÑÐµÑ ÑÑиггеÑной ÑÑнкÑии изменÑÑÑ Ð²ÑÑавлÑемÑÑ Ð¸Ð»Ð¸ обновлÑемÑÑ ÑÑÑокÑ.
ÐÑли в ÑÑиггеÑе BEFORE ÑÑÐ¾Ð²Ð½Ñ ÑÑÑоки не планиÑÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð»Ñбой из ÑÑиÑ
ваÑианÑов, Ñо нÑжно аккÑÑаÑно веÑнÑÑÑ Ð² каÑеÑÑве ÑезÑлÑÑаÑа ÑÑ Ð¶Ðµ ÑÑÑокÑ, коÑоÑÐ°Ñ Ð±Ñла пеÑедана на вÑ
од (Ñо еÑÑÑ ÑÑÑÐ¾ÐºÑ NEW Ð´Ð»Ñ ÑÑиггеÑов INSERT и UPDATE, или ÑÑÑÐ¾ÐºÑ OLD Ð´Ð»Ñ ÑÑиггеÑов DELETE).
ТÑÐ¸Ð³Ð³ÐµÑ ÑÑÐ¾Ð²Ð½Ñ ÑÑÑоки INSTEAD OF должен веÑнÑÑÑ Ð»Ð¸Ð±Ð¾ NULL, ÑÑÐ¾Ð±Ñ ÑказаÑÑ, ÑÑо он не модиÑиÑиÑÑÐµÑ Ð±Ð°Ð·Ð¾Ð²Ñе ÑаблиÑÑ Ð¿ÑедÑÑавлениÑ, либо он должен веÑнÑÑÑ ÑÑÑÐ¾ÐºÑ Ð¿ÑедÑÑавлениÑ, полÑÑеннÑÑ Ð½Ð° вÑ
оде (ÑÑÑÐ¾ÐºÑ NEW Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑий INSERT и UPDATE или ÑÑÑÐ¾ÐºÑ OLD Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑий DELETE). ÐÑлиÑное Ð¾Ñ NULL возвÑаÑаемое знаÑение ÑигнализиÑÑеÑ, ÑÑо ÑÑÐ¸Ð³Ð³ÐµÑ Ð²Ñполнил необÑ
одимÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
в пÑедÑÑавлении. ÐÑо пÑиведÑÑ Ðº ÑвелиÑÐµÐ½Ð¸Ñ ÑÑÑÑÑика колиÑеÑÑва ÑÑÑок, заÑÑонÑÑÑÑ
командой. ÐÐ»Ñ Ð¾Ð¿ÐµÑаÑий INSERT и UPDATE (и ÑолÑко Ð´Ð»Ñ Ð½Ð¸Ñ
) ÑÑÐ¸Ð³Ð³ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ ÑÑÑÐ¾ÐºÑ NEW пеÑед Ñем как ÐµÑ Ð²ÐµÑнÑÑÑ. Ð ÑезÑлÑÑаÑе бÑдÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð´Ð°Ð½Ð½Ñе, возвÑаÑаемÑе INSERT RETURNING или UPDATE RETURNING, ÑÑо полезно, когда пÑедÑÑавление должно возвÑаÑаÑÑ Ð½Ðµ Ñе даннÑе, ÑÑо бÑли полÑÑенÑ.
ÐозвÑаÑаемое знаÑение игноÑиÑÑеÑÑÑ Ð´Ð»Ñ ÑÑиггеÑов ÑÑÐ¾Ð²Ð½Ñ ÑÑÑоки, вÑзÑваемÑÑ
поÑле опеÑаÑии, поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¸ могÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ NULL.
ÐенеÑиÑÑемÑе ÑÑолбÑÑ Ð·Ð°ÑлÑживаÑÑ Ð¾ÑделÑного вниманиÑ. Ð¥ÑанимÑе генеÑиÑÑемÑе ÑÑолбÑÑ Ð²ÑÑиÑлÑÑÑÑÑ Ð¿Ð¾Ñле ÑÑиггеÑов BEFORE и пеÑед ÑÑиггеÑами AFTER. Таким обÑазом, в ÑÑиггеÑаÑ
AFTER можно наблÑдаÑÑ ÑгенеÑиÑованное знаÑение. Ð ÑÑиггеÑаÑ
BEFORE ÑÑÑока OLD, как можно бÑло ожидаÑÑ, ÑодеÑÐ¶Ð¸Ñ Ð¿ÑедÑдÑÑее знаÑение, однако в ÑÑÑоке NEW еÑÑ Ð½Ðµ ÑодеÑжиÑÑÑ Ð½Ð¾Ð²Ð¾Ðµ ÑгенеÑиÑованное знаÑение, и обÑаÑаÑÑÑÑ Ðº Ð½ÐµÐ¼Ñ Ð½Ðµ ÑледÑеÑ. Ðа ÑÑовне ÑзÑка C ÑодеÑжимое ÑÑолбÑа в ÑÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÑиÑаеÑÑÑ Ð½ÐµÐ¾Ð¿ÑеделÑннÑм; более вÑÑокоÑÑовневÑе ÑзÑки Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº Ñ
ÑÐ°Ð½Ð¸Ð¼Ð¾Ð¼Ñ Ð³ÐµÐ½ÐµÑиÑÑÐµÐ¼Ð¾Ð¼Ñ ÑÑолбÑÑ Ð² ÑÑÑоке NEW внÑÑÑи ÑÑиггеÑа BEFORE. ÐзменÑннÑе в ÑÑиггеÑе BEFORE знаÑÐµÐ½Ð¸Ñ Ð³ÐµÐ½ÐµÑиÑÑемого ÑÑолбÑа игноÑиÑÑÑÑÑÑ Ð¸ бÑдÑÑ Ð¿ÐµÑезапиÑанÑ.
ÐÑли еÑÑÑ Ð½ÐµÑколÑко ÑÑиггеÑов на одно и Ñо же ÑобÑÑие Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ и Ñой же ÑаблиÑÑ, Ñо они бÑдÑÑ Ð²ÑзÑваÑÑÑÑ Ð² алÑавиÑном поÑÑдке по имени ÑÑиггеÑа. ÐÐ»Ñ ÑÑиггеÑов BEFORE и INSTEAD OF поÑенÑиалÑно изменÑÐ½Ð½Ð°Ñ ÑÑÑока, возвÑаÑÐ°ÐµÐ¼Ð°Ñ Ð¾Ð´Ð½Ð¸Ð¼ ÑÑиггеÑом, ÑÑановиÑÑÑ Ð²Ñ
одÑÑей ÑÑÑокой Ð´Ð»Ñ ÑледÑÑÑего ÑÑиггеÑа. ÐÑли лÑбой из ÑÑиггеÑов BEFORE или INSTEAD OF возвÑаÑÐ°ÐµÑ NULL, опеÑаÑÐ¸Ñ Ð´Ð»Ñ ÑÑой ÑÑÑоки пÑекÑаÑаеÑÑÑ Ð¸ поÑледÑÑÑие ÑÑиггеÑÑ (Ð´Ð»Ñ ÑÑой ÑÑÑоки) не ÑÑабаÑÑваÑÑ.
РопÑеделении ÑÑиггеÑа можно ÑказаÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкое ÑÑловие WHEN, коÑоÑое бÑÐ´ÐµÑ Ð¿ÑовеÑÑÑÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÑмоÑÑеÑÑ, нÑжно ли запÑÑкаÑÑ ÑÑиггеÑ. Ð ÑÑиггеÑаÑ
ÑÑÐ¾Ð²Ð½Ñ ÑÑÑоки в ÑÑловии WHEN можно пÑовеÑÑÑÑ ÑÑаÑÑе и/или новÑе знаÑÐµÐ½Ð¸Ñ ÑÑолбÑов ÑÑÑоки. (Ð ÑÑиггеÑаÑ
ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа Ñакже можно иÑполÑзоваÑÑ ÑÑловие WHEN, Ñ
оÑÑ Ð² ÑÑом ÑлÑÑае ÑÑо не Ñак полезно.) Ð ÑÑиггеÑаÑ
BEFORE ÑÑловие WHEN вÑÑиÑлÑеÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пеÑед Ñем, как ÑÑиггеÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ñполнена, поÑÑÐ¾Ð¼Ñ Ð¸ÑполÑзование WHEN ÑÑÑеÑÑвенно не оÑлиÑаеÑÑÑ Ð¾Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñой же пÑовеÑки в Ñамом наÑале ÑÑиггеÑной ÑÑнкÑии. Ðднако в ÑÑиггеÑаÑ
AFTER ÑÑловие WHEN вÑÑиÑлÑеÑÑÑ ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑÑоки и Ð¾Ñ ÑÑого завиÑиÑ, бÑÐ´ÐµÑ Ð»Ð¸ поÑÑавлено в оÑеÑÐµÐ´Ñ ÑобÑÑие запÑÑка ÑÑиггеÑа в конÑе опеÑаÑоÑа или неÑ. ÐоÑÑомÑ, когда ÑÑловие WHEN в ÑÑиггеÑе AFTER не возвÑаÑÐ°ÐµÑ Ð¸ÑÑинÑ, не ÑÑебÑеÑÑÑ Ð½Ð¸ поÑÑановка ÑобÑÑÐ¸Ñ Ð² оÑеÑедÑ, ни повÑоÑÐ½Ð°Ñ Ð²ÑбоÑка ÑÑой ÑÑÑоки в конÑе опеÑаÑоÑа. ÐÑо Ð¼Ð¾Ð¶ÐµÑ ÑÑÑеÑÑвенно ÑÑкоÑиÑÑ ÑабоÑÑ Ð¾Ð¿ÐµÑаÑоÑов, изменÑÑÑиÑ
болÑÑое колиÑеÑÑво ÑÑÑок, Ñ ÑÑиггеÑом, коÑоÑÑй должен ÑÑабоÑаÑÑ ÑолÑко Ð´Ð»Ñ Ð½ÐµÑколÑкиÑ
. Ð ÑÑиггеÑаÑ
INSTEAD OF не поддеÑживаеÑÑÑ Ð¸ÑполÑзование ÑÑловий WHEN.
Ðак пÑавило, ÑÑиггеÑÑ BEFORE ÑÑÐ¾Ð²Ð½Ñ ÑÑÑоки иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð¿ÑовеÑки или модиÑикаÑии даннÑÑ
, коÑоÑÑе бÑдÑÑ Ð²ÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð¸Ð»Ð¸ измененÑ. ÐапÑимеÑ, ÑÑÐ¸Ð³Ð³ÐµÑ BEFORE можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð²ÑÑавки ÑекÑÑего вÑемени в ÑÑÐ¾Ð»Ð±ÐµÑ timestamp или пÑовеÑки, ÑÑо два ÑлеменÑа ÑÑÑоки ÑоглаÑÐ¾Ð²Ð°Ð½Ñ Ð¼ÐµÐ¶Ð´Ñ Ñобой. ТÑиггеÑÑ AFTER ÑÑÐ¾Ð²Ð½Ñ ÑÑÑоки наиболее ÑазÑмно иÑполÑзоваÑÑ Ð´Ð»Ñ ÐºÐ°Ñкадного Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
в дÑÑгиÑ
ÑаблиÑаÑ
или пÑовеÑки ÑоглаÑованноÑÑи ÑделаннÑÑ
изменений Ñ Ð´Ð°Ð½Ð½Ñми в дÑÑгиÑ
ÑаблиÑаÑ
. ÐÑиÑина Ð´Ð»Ñ Ñакого ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÑабоÑÑ Ð² Ñом, ÑÑо ÑÑÐ¸Ð³Ð³ÐµÑ AFTER Ð²Ð¸Ð´Ð¸Ñ Ð¾ÐºÐ¾Ð½ÑаÑелÑное знаÑение ÑÑÑоки, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº Ð´Ð»Ñ ÑÑиггеÑа BEFORE ÑÑо не Ñак, Ð²ÐµÐ´Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð´ÑÑгие ÑÑиггеÑÑ BEFORE, коÑоÑÑе ÑÑабоÑаÑÑ Ð¿Ð¾Ð·Ð¶Ðµ. ÐÑли Ð½ÐµÑ Ð¾ÑобÑÑ
пÑиÑин Ð´Ð»Ñ Ð²ÑбоÑа Ð¼ÐµÐ¶Ð´Ñ ÑÑиггеÑами BEFORE или AFTER, Ñо ÑÑÐ¸Ð³Ð³ÐµÑ BEFORE пÑедпоÑÑиÑелÑнее, Ñак как не ÑÑебÑÐµÑ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии об опеÑаÑии до конÑа ÑабоÑÑ Ð¾Ð¿ÐµÑаÑоÑа.
ÐÑли ÑÑиггеÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²ÑполнÑÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL, ÑÑи ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¼Ð¾Ð³ÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾ запÑÑкаÑÑ ÑÑиггеÑÑ. ÐÑо извеÑÑно как каÑкаднÑе ÑÑиггеÑÑ. ÐÑÑмÑÑ
огÑаниÑений на колиÑеÑÑво каÑкаднÑÑ
ÑÑовней не ÑÑÑеÑÑвÑеÑ. Ðполне возможно, ÑÑо каÑкаднÑе вÑÐ·Ð¾Ð²Ñ Ð¿ÑиведÑÑ Ðº ÑекÑÑÑÐ¸Ð²Ð½Ð¾Ð¼Ñ ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ и Ñого же ÑÑиггеÑа. ÐапÑимеÑ, в ÑÑиггеÑе INSERT Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°, коÑоÑÐ°Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÐµÑ ÑÑÑÐ¾ÐºÑ Ð² ÑÑÑ Ð¶Ðµ ÑаблиÑÑ, Ñем ÑамÑм опÑÑÑ Ð²ÑзÑÐ²Ð°Ñ ÑÑÐ¸Ð³Ð³ÐµÑ Ð½Ð° INSERT. ÐбÑзанноÑÑÑ Ð¿ÑогÑаммиÑÑа не допÑÑкаÑÑ Ð±ÐµÑконеÑнÑÑ ÑекÑÑÑÐ¸Ñ Ð² ÑакиÑ
ÑлÑÑаÑÑ
.
ÐÑи опÑеделении ÑÑиггеÑа можно ÑказÑваÑÑ Ð°ÑгÑменÑÑ. Ð¦ÐµÐ»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð°ÑгÑменÑов в опÑеделение ÑÑиггеÑа в Ñом, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸ÑÑ ÑазнÑм ÑÑиггеÑам Ñ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸ÑнÑми ÑÑебованиÑми вÑзÑваÑÑ Ð¾Ð´Ð½Ñ Ð¸ ÑÑ Ð¶Ðµ ÑÑнкÑиÑ. РкаÑеÑÑве пÑимеÑа можно ÑоздаÑÑ Ð¾Ð±Ð¾Ð±ÑеннÑÑ ÑÑиггеÑнÑÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´Ð²Ð° аÑгÑменÑа Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ ÑÑолбÑов и запиÑÑÐ²Ð°ÐµÑ ÑекÑÑего полÑзоваÑÐµÐ»Ñ Ð² пеÑвÑй аÑгÑÐ¼ÐµÐ½Ñ Ð¸ ÑекÑÑий ÑÑамп вÑемени во вÑоÑой. ÐÑи пÑавилÑном напиÑании ÑÐ°ÐºÐ°Ñ ÑÑиггеÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñима Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑной ÑаблиÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑой она бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑÑкаÑÑÑÑ. Таким обÑазом, одна и Ñа же ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¿Ñи вÑполнении INSERT в лÑбÑÑ ÑаблиÑÑ Ñ ÑооÑвеÑÑÑвÑÑÑими ÑÑолбÑами, ÑÑобÑ, напÑимеÑ, авÑомаÑиÑеÑки оÑÑлеживаÑÑ Ñоздание запиÑей в ÑÑанзакÑионной ÑаблиÑе. ÐÐ»Ñ ÑÑиггеÑов UPDATE аÑгÑменÑÑ Ñакже могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑледниÑ
ÑделаннÑÑ
изменений.
У каждого ÑзÑка пÑогÑаммиÑованиÑ, поддеÑживаÑÑего ÑÑиггеÑÑ, еÑÑÑ Ñвой ÑобÑÑвеннÑй меÑод доÑÑÑпа из ÑÑиггеÑной ÑÑнкÑии к вÑ
однÑм даннÑм ÑÑиггеÑа. ÐÑ
однÑе даннÑе ÑÑиггеÑа вклÑÑаÑÑ Ð² ÑÐµÐ±Ñ Ñип ÑобÑÑÐ¸Ñ (напÑимеÑ, INSERT или UPDATE), а Ñакже лÑбÑе аÑгÑменÑÑ, пеÑеÑиÑленнÑе в CREATE TRIGGER. ÐÐ»Ñ ÑÑиггеÑов ÑÑÐ¾Ð²Ð½Ñ ÑÑÑоки вÑ
однÑе даннÑе Ñакже вклÑÑаÑÑ ÑÑÑÐ¾ÐºÑ NEW Ð´Ð»Ñ ÑÑиггеÑов INSERT и UPDATE и/или ÑÑÑÐ¾ÐºÑ OLD Ð´Ð»Ñ ÑÑиггеÑов UPDATE и DELETE.
ТÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа по ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ðµ имеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑей Ð´Ð»Ñ Ð¿ÑовеÑки оÑделÑнÑÑ
ÑÑÑок, модиÑиÑиÑованнÑÑ
опеÑаÑоÑом. Ðо ÑÑÐ¸Ð³Ð³ÐµÑ AFTER STATEMENT Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑоÑиÑÑ Ñоздание Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ пеÑеÑ
однÑÑ
ÑаблиÑ, ÑÑÐ¾Ð±Ñ ÐµÐ¼Ñ Ð±Ñли доÑÑÑÐ¿Ð½Ñ Ð½Ð°Ð±Ð¾ÑÑ Ð·Ð°ÑÑагиваемÑÑ
опеÑаÑией ÑÑÑок. ТÑиггеÑам AFTER ROW Ñакже могÑÑ Ð¿ÑедоÑÑавлÑÑÑÑÑ Ð¿ÐµÑеÑ
однÑе ÑаблиÑÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ могли видеÑÑ Ð²Ñе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑаблиÑе, а не ÑолÑко Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² оÑделÑнÑÑ
ÑÑÑокаÑ
, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
они ÑÑабаÑÑваÑÑ. ÐеÑод обÑаÑÐµÐ½Ð¸Ñ Ðº пеÑеÑ
однÑм ÑаблиÑам опÑеделÑеÑÑÑ Ð¿ÑименÑемÑм ÑзÑком пÑогÑаммиÑованиÑ, но обÑÑно пеÑеÑ
однÑе ÑаблиÑÑ Ð¿ÑедÑÑавлÑÑÑÑÑ ÐºÐ°Ðº вÑеменнÑе ÑаблиÑÑ ÑолÑко Ð´Ð»Ñ ÑÑениÑ, к коÑоÑÑм в ÑÑиггеÑной ÑÑнкÑии можно обÑаÑаÑÑÑÑ, вÑполнÑÑ SQL-командÑ.