36.1. ÐÐ±Ð·Ð¾Ñ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° ÑабоÑÑ ÑÑиггеÑов
ТÑÐ¸Ð³Ð³ÐµÑ ÑвлÑеÑÑÑ Ñказанием, ÑÑо база даннÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° авÑомаÑиÑеÑки вÑполниÑÑ Ð·Ð°Ð´Ð°Ð½Ð½ÑÑ ÑÑнкÑиÑ, вÑÑкий Ñаз когда вÑполнен опÑеделÑннÑй Ñип опеÑаÑии. ТÑиггеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ñ ÑаблиÑами, Ñ Ð¿ÑедÑÑавлениÑми и Ñ Ð²Ð½ÐµÑними ÑаблиÑами.
ÐÐ»Ñ Ð¾Ð±ÑÑнÑÑ
и ÑÑоÑонниÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ опÑеделÑÑÑ ÑÑиггеÑÑ, коÑоÑÑе бÑдÑÑ ÑÑабаÑÑваÑÑ Ð´Ð¾ или поÑле лÑбой из команд INSERT, UPDATE или DELETE; либо один Ñаз Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ модиÑиÑиÑÑемой ÑÑÑоки, либо один Ñаз Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа SQL. С запÑоÑом INSERT, ÑодеÑжаÑим пÑедложение ON CONFLICT DO UPDATE, возможна ÑиÑÑаÑиÑ, когда пÑоÑвиÑÑÑ Ð´ÐµÐ¹ÑÑвие ÑÑÐ°Ð·Ñ Ð´Ð²ÑÑ
ÑÑиггеÑов BEFORE INSERT и BEFORE UPDATE, еÑли запÑÐ¾Ñ Ð¾Ð±ÑаÑаеÑÑÑ Ðº ÑÑолбÑам EXCLUDED. Ðолее Ñого, ÑÑиггеÑÑ UPDATE можно ÑÑÑановиÑÑ Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ ÑÑабаÑÑвали, ÑолÑко когда в пÑедложении SET опеÑаÑоÑа UPDATE ÑпоминаÑÑÑÑ Ð¾Ð¿ÑеделÑннÑе ÑÑолбÑÑ. Также ÑÑиггеÑÑ Ð¼Ð¾Ð³ÑÑ ÑÑабаÑÑваÑÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑов TRUNCATE (ÑÑоÑонние ÑаблиÑÑ Ð½Ðµ поддеÑживаÑÑ ÑÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð²Ð¾Ð²Ñе). Ðогда пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÑобÑÑие ÑÑиггеÑа, Ð´Ð»Ñ Ð¾Ð±ÑабоÑки ÑÑого ÑобÑÑÐ¸Ñ Ð² ÑÑÑановленнÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñемени вÑзÑваеÑÑÑ ÑÑнкÑÐ¸Ñ ÑÑиггеÑа.
ÐÐ»Ñ Ð¿ÑедÑÑавлений ÑÑиггеÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ð¼ÐµÑÑо опеÑаÑий INSERT, UPDATE и DELETE. Такие ÑÑиггеÑÑ INSTEAD OF вÑзÑваÑÑÑÑ ÐµÐ´Ð¸Ð½Ð¾Ð¶Ð´Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки, коÑоÑÐ°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð° в ÑÑом пÑедÑÑавлении. Ðменно ÑÑнкÑÐ¸Ñ ÑÑиггеÑа оÑвеÑÐ°ÐµÑ Ð·Ð° Ñо, ÑÑÐ¾Ð±Ñ Ð¿ÑоизвеÑÑи необÑ
одимÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² нижележаÑиÑ
базовÑÑ
ÑаблиÑаÑ
пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ должнÑм обÑазом возвÑаÑаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑннÑе ÑÑÑоки, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ поÑвлÑлиÑÑ Ð² пÑедÑÑавлении. ТÑиггеÑÑ Ð´Ð»Ñ Ð¿ÑедÑÑавлений Ñоже могÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ñак, ÑÑо они бÑдÑÑ Ð²ÑполнÑÑÑÑÑ ÐµÐ´Ð¸Ð½Ð¾Ð¶Ð´Ñ Ð´Ð»Ñ Ð²Ñего опеÑаÑоÑа SQL, до или поÑле опеÑаÑий INSERT, UPDATE или DELETE. Ðднако Ñакие ÑÑиггеÑÑ ÑÑабаÑÑваÑÑ, ÑолÑко еÑли Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑеделÑн ÑÑÐ¸Ð³Ð³ÐµÑ INSTEAD OF. РпÑоÑивном ÑлÑÑае вÑе опеÑаÑоÑÑ, обÑаÑаÑÑиеÑÑ Ðº пÑедÑÑавлениÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿ÐµÑепиÑÐ°Ð½Ñ Ð² виде опеÑаÑоÑов, обÑаÑаÑÑиÑ
ÑÑ Ðº нижележаÑим базовÑм ÑаблиÑам, и Ñогда бÑдÑÑ ÑÑабаÑÑваÑÑ ÑÑиггеÑÑ, ÑÑÑановленнÑе Ð´Ð»Ñ ÑÑиÑ
ÑаблиÑ.
ТÑиггеÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ñоздана до ÑÑиггеÑа. Ðна должна бÑÑÑ Ð¾Ð±ÑÑвлена без аÑгÑменÑов и возвÑаÑаÑÑ Ñип trigger. (ТÑиггеÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð´Ð°Ð½Ð½Ñе на вÑ
од поÑÑедÑÑвом ÑпеÑиалÑно пеÑеданной ÑÑÑÑкÑÑÑÑ TriggerData, а не в ÑоÑме обÑÑнÑÑ
аÑгÑменÑов.)
ÐоÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑиггеÑной ÑÑнкÑии ÑоздаÑÑÑÑ ÑÑÐ¸Ð³Ð³ÐµÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CREATE TRIGGER. Ðдна и Ñа же ÑÑиггеÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзована Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑиггеÑов.
Postgres Pro пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ ÐºÐ°Ðº поÑÑÑоÑнÑе ÑÑиггеÑÑ, Ñак и опеÑаÑоÑнÑе ÑÑиггеÑÑ. Ð ÑлÑÑае поÑÑÑоÑного ÑÑиггеÑа, ÑÑиггеÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²ÑзÑваеÑÑÑ Ð¾Ð´Ð¸Ð½ Ñаз Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки, заÑÑонÑÑой опеÑаÑоÑом, запÑÑÑивÑим ÑÑиггеÑ. РпÑоÑивоположноÑÑÑ ÑÑомÑ, опеÑаÑоÑнÑй ÑÑÐ¸Ð³Ð³ÐµÑ Ð²ÑзÑваеÑÑÑ ÑолÑко один Ñаз пÑи вÑполнении ÑооÑвеÑÑÑвÑÑÑего опеÑаÑоÑа, незавиÑимо Ð¾Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑва ÑÑÑок, коÑоÑÑе он заÑÑагиваеÑ. Ð ÑаÑÑноÑÑи опеÑаÑоÑ, коÑоÑÑй вообÑе не заÑÑÐ°Ð³Ð¸Ð²Ð°ÐµÑ ÑÑÑок, вÑе Ñавно пÑиведÑÑ Ðº ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑного ÑÑиггеÑа. ÐÑи два Ñипа ÑÑиггеÑов иногда назÑваÑÑ ÑÑиггеÑами ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок и ÑÑиггеÑами ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа ÑооÑвеÑÑÑвенно. ТÑиггеÑÑ Ð½Ð° TRUNCATE могÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑолÑко на ÑÑовне опеÑаÑоÑа. ТÑиггеÑÑ Ð´Ð»Ñ Ð¿ÑедÑÑавлений, ÑÑабаÑÑваÑÑие до или поÑле, могÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑолÑко на ÑÑовне опеÑаÑоÑа, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº ÑÑиггеÑÑ, ÑÑабаÑÑваÑÑие вмеÑÑо команд INSERT, UPDATE или DELETE, могÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑолÑко на ÑÑовне ÑÑÑок.
ТÑиггеÑÑ Ñакже клаÑÑиÑиÑиÑÑÑÑÑÑ Ð² ÑооÑвеÑÑÑвии Ñ Ñем, ÑÑабаÑÑваÑÑ Ð»Ð¸ они до, поÑле или вмеÑÑо опеÑаÑии. Ðни назÑваÑÑÑÑ ÑÑиггеÑами 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 (ÑеÑÑ Ð¸Ð´ÑÑ Ð¾ ÑÑиггеÑаÑ
на ÑÑовне опеÑаÑоÑов).
ТÑиггеÑнÑе ÑÑнкÑии, вÑзÑваемÑе ÑÑиггеÑами опеÑаÑоÑов, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ñегда возвÑаÑаÑÑ 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 и 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. ТÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ имеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑей Ð´Ð»Ñ Ð¿ÑовеÑки оÑделÑнÑÑ
ÑÑÑок, модиÑиÑиÑованнÑÑ
опеÑаÑоÑом.