9.29. ТÑиггеÑнÑе ÑÑнкÑии #
Тогда как в болÑÑинÑÑве ÑлÑÑаев иÑполÑзование ÑÑиггеÑов подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ð½Ð°Ð¿Ð¸Ñание полÑзоваÑелÑÑÐºÐ¸Ñ ÑÑиггеÑнÑÑ ÑÑнкÑий, в PostgreSQL имееÑÑÑ Ð½ÐµÑколÑко вÑÑÑоеннÑÑ ÑÑиггеÑнÑÑ ÑÑнкÑий, коÑоÑÑе можно иÑполÑзоваÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в полÑзоваÑелÑÑÐºÐ¸Ñ ÑÑиггеÑÐ°Ñ . ÐÑи ÑÑнкÑии Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð² ТаблиÑе 9.110. (СÑÑеÑÑвÑÑÑ Ð¸ дÑÑгие вÑÑÑоеннÑе ÑÑиггеÑнÑе ÑÑнкÑии, ÑеализÑÑÑие огÑаниÑÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑнего клÑÑа и оÑложеннÑе огÑаниÑÐµÐ½Ð¸Ñ Ð¿Ð¾ индекÑам. Ðднако они не докÑменÑиÑованÑ, Ñак как полÑзоваÑелÑм не нÑжно иÑполÑзоваÑÑ Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно.)
ÐодÑобнее о Ñоздании ÑÑиггеÑов можно ÑзнаÑÑ Ð² опиÑании CREATE TRIGGER.
ТаблиÑа 9.110. ÐÑÑÑоеннÑе ÑÑиггеÑнÑе ÑÑнкÑии
ФÑнкÑÐ¸Ñ ÐпиÑание ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ |
|---|
ÐÑедоÑвÑаÑÐ°ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, не менÑÑÑие даннÑе. ÐодÑобнее об ÑÑом ÑаÑÑказÑваеÑÑÑ Ð½Ð¸Ð¶Ðµ.
|
ÐвÑомаÑиÑеÑки обновлÑÐµÑ ÑодеÑжимое ÑÑолбÑа
|
ÐвÑомаÑиÑеÑки обновлÑÐµÑ ÑодеÑжимое ÑÑолбÑа
|
ФÑнкÑÐ¸Ñ suppress_redundant_updates_trigger, пÑименÑÐµÐ¼Ð°Ñ Ð² каÑеÑÑве ÑÑиггеÑа BEFORE UPDATE на ÑÑовне ÑÑÑок, пÑедоÑвÑаÑÐ¸Ñ Ð²Ð½ÐµÑение изменений, пÑи коÑоÑÑÑ
даннÑе в ÑÑÑоке ÑакÑиÑеÑки не менÑÑÑÑÑ. Тем ÑамÑм пеÑеопÑеделÑеÑÑÑ Ð¾Ð±ÑÑное поведение, когда изменение ÑизиÑеÑкой ÑÑÑоки пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð²Ð½Ðµ завиÑимоÑÑи Ð¾Ñ Ñого, бÑли ли Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð´Ð°Ð½Ð½Ñе. (ÐбÑÑное поведение не пÑÐµÐ´Ð¿Ð¾Ð»Ð°Ð³Ð°ÐµÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
, поÑÑÐ¾Ð¼Ñ Ð¾Ð¿ÐµÑаÑии Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑполнÑÑÑÑÑ Ð±ÑÑÑÑее, и в ÑÑде ÑлÑÑаев именно ÑÑо поведение желаÑелÑно.)
Ридеале ÑледÑÐµÑ Ð¸Ð·Ð±ÐµÐ³Ð°ÑÑ Ð¾Ð¿ÐµÑаÑий изменениÑ, коÑоÑÑе ÑакÑиÑеÑки не менÑÑÑ Ð´Ð°Ð½Ð½Ñе в запиÑÑÑ
. ÐодобнÑе ненÑжнÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¾Ð±Ñ
одиÑÑÑÑ Ð´Ð¾Ñого, оÑобенно когда ÑÑебÑеÑÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво индекÑов, к ÑÐ¾Ð¼Ñ Ð¶Ðµ впоÑледÑÑвии Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
пÑидÑÑÑÑ Ð¾ÑиÑаÑÑ Ð¾Ñ Â«Ð¼ÑÑÑвÑÑ
» ÑÑÑок. Ðднако вÑÑвиÑÑ Ñакие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² клиенÑÑком коде бÑÐ²Ð°ÐµÑ Ñложно, еÑли вообÑе возможно, а пÑи ÑоÑÑавлении ÑооÑвеÑÑÑвÑÑÑиÑ
пÑовеÑоÑнÑÑ
вÑÑажений легко допÑÑÑиÑÑ Ð¾ÑибкÑ. РкаÑеÑÑве алÑÑеÑнаÑивного ÑеÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ ÑÑнкÑÐ¸Ñ suppress_redundant_updates_trigger, коÑоÑÐ°Ñ Ð¾Ð¿ÑÑÐºÐ°ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, не менÑÑÑие даннÑе. Ðднако иÑполÑзоваÑÑ ÐµÑ ÑледÑÐµÑ Ñ Ð¾ÑÑоÑожноÑÑÑÑ. ÐаннÑй ÑÑÐ¸Ð³Ð³ÐµÑ Ð²ÑполнÑеÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ запиÑи доволÑно бÑÑÑÑо, но вÑÑ Ð¶Ðµ не мгновенно, Ñак ÑÑо еÑли болÑÑинÑÑво заÑÑонÑÑÑÑ
запиÑей ÑакÑиÑеÑки изменÑеÑÑÑ, Ñ ÑÑим ÑÑиггеÑом опеÑаÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑÑеднем замедлиÑÑÑ.
ФÑнкÑÐ¸Ñ suppress_redundant_updates_trigger можно пÑивÑзаÑÑ Ðº ÑаблиÑе Ñак:
CREATE TRIGGER z_min_update BEFORE UPDATE ON tablename FOR EACH ROW EXECUTE FUNCTION suppress_redundant_updates_trigger();
РболÑÑинÑÑве ÑлÑÑаев ÑÑÐ¾Ñ ÑÑÐ¸Ð³Ð³ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ вÑзÑваÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки поÑледним, ÑÑÐ¾Ð±Ñ Ð¾Ð½ не пеÑекÑÑл дÑÑгие ÑÑиггеÑÑ, коÑоÑÑм Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ð¸ÑÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ ÑÑÑокÑ. С ÑÑÑÑом Ñого, ÑÑо ÑÑиггеÑÑ Ð²ÑзÑваÑÑÑÑ Ð¿Ð¾ поÑÑÐ´ÐºÑ ÑоÑÑиÑовки Ð¸Ñ Ð¸Ð¼Ñн, Ð¸Ð¼Ñ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ нÑжно вÑбиÑаÑÑ Ñаким, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¾ бÑло поÑледним ÑÑеди имÑн вÑÐµÑ ÑÑиггеÑов, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð² ÑаблиÑе. (Ðз ÑÑого ÑообÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð²ÑбÑан пÑеÑÐ¸ÐºÑ Â«z» в данном пÑимеÑе.)