37.2. СиÑÑема пÑавил и пÑедÑÑавлениÑ
ÐÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² Postgres Pro ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ Ð½Ð° оÑнове ÑиÑÑÐµÐ¼Ñ Ð¿Ñавил. ФакÑиÑеÑки по ÑÑÑи Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð³Ð¾ оÑлиÑиÑ
CREATE VIEW myview AS SELECT * FROM mytab;
Ð¾Ñ ÑледÑÑÑÐ¸Ñ Ð´Ð²ÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´:
CREATE TABLE myview (same column list as mytab);
CREATE RULE "_RETURN" AS ON SELECT TO myview DO INSTEAD
SELECT * FROM mytab; Ñак как именно ÑÑи дейÑÑÐ²Ð¸Ñ CREATE VIEW вÑполнÑÐµÑ Ð²Ð½ÑÑÑи. ÐÑо Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑе побоÑнÑе ÑÑÑекÑÑ. Ð ÑаÑÑноÑÑи, инÑоÑмаÑÐ¸Ñ Ð¾ пÑедÑÑавлениÑÑ
в ÑиÑÑемнÑÑ
каÑалогаÑ
Postgres Pro ниÑем не оÑлиÑаеÑÑÑ Ð¾Ñ Ð¸Ð½ÑоÑмаÑии о ÑаблиÑаÑ
. ÐоÑÑÐ¾Ð¼Ñ Ð¿Ñи анализе запÑоÑа Ð½ÐµÑ Ð°Ð±ÑолÑÑно никакой ÑазниÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑаблиÑами и пÑедÑÑавлениÑми. Ðни пÑедÑÑавлÑÑÑ Ñобой одно и Ñо же â оÑноÑениÑ.
37.2.1. Ðак ÑабоÑаÑÑ Ð¿Ñавила SELECT
ÐÑавила ON SELECT пÑименÑÑÑÑÑ ÐºÐ¾ вÑем запÑоÑам на поÑледнем ÑÑапе, даже еÑли ÑÑо команда INSERT, UPDATE или DELETE. ÐÑи пÑавила оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¿Ñавил дÑÑгиÑ
видов Ñем, ÑÑо они модиÑиÑиÑÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно деÑево запÑоÑов, а не ÑоздаÑÑ Ð½Ð¾Ð²Ð¾Ðµ. ÐоÑÑÐ¾Ð¼Ñ Ð¼Ñ Ð½Ð°ÑнÑм опиÑание Ñ Ð¿Ñавил SELECT.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ ÑолÑко одно дейÑÑвие в пÑавиле ON SELECT и ÑÑо должно бÑÑÑ Ð±ÐµÐ·ÑÑловное дейÑÑвие SELECT, вÑполнÑемое в Ñежиме INSTEAD. ÐÑо огÑаниÑение бÑло введено, ÑÑÐ¾Ð±Ñ ÑделаÑÑ Ð¿Ñавила доÑÑаÑоÑно безопаÑнÑми Ð´Ð»Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑÑнÑми полÑзоваÑелÑми, Ñак ÑÑо дейÑÑвие пÑавил ON SELECT ÑводиÑÑÑ Ðº ÑеализаÑии пÑедÑÑавлений.
РпÑимеÑаÑ
ÑÑой Ð³Ð»Ð°Ð²Ñ ÑаÑÑмаÑÑиваÑÑÑÑ Ð´Ð²Ð° пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ñоединением, коÑоÑÑе вÑполнÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе вÑÑиÑлениÑ, и коÑоÑÑе, в ÑÐ²Ð¾Ñ Ð¾ÑеÑедÑ, иÑполÑзÑÑÑÑÑ Ð´ÑÑгими пÑедÑÑавлениÑми. ÐеÑвое из ÑÑиÑ
двÑÑ
пÑедÑÑавлений заÑем модиÑиÑиÑÑеÑÑÑ, к Ð½ÐµÐ¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑÑÑ Ð¿Ñавила Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑий INSERT, UPDATE и DELETE, Ñак ÑÑо в иÑоге полÑÑаеÑÑÑ Ð¿ÑедÑÑавление, коÑоÑое ÑабоÑÐ°ÐµÑ ÐºÐ°Ðº обÑÑÐ½Ð°Ñ ÑаблиÑа Ñ Ð½ÐµÐºÐ¾ÑоÑÑми необÑÑнÑми ÑÑнкÑиÑми. ÐÑо не ÑамÑй пÑоÑÑой пÑÐ¸Ð¼ÐµÑ Ð´Ð»Ñ Ð½Ð°Ñала, поÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð½ÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе веÑи бÑÐ´ÐµÑ Ñложнее. Ðо лÑÑÑе имеÑÑ Ð¾Ð´Ð¸Ð½ пÑимеÑ, поÑÑапно оÑ
ваÑÑваÑÑий вÑе обÑÑждаемÑе здеÑÑ ÑемÑ, Ñем неÑколÑко ÑазлиÑнÑÑ
, пÑи воÑпÑиÑÑии коÑоÑÑÑ
в иÑоге Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ Ð¿ÑÑаниÑа.
ТаблиÑÑ, коÑоÑÑе понадобÑÑÑÑ Ð½Ð°Ð¼ Ð´Ð»Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÑиÑÑÐµÐ¼Ñ Ð¿Ñавил, вÑглÑдÑÑ Ñак:
CREATE TABLE shoe_data (
shoename text, -- пеÑвиÑнÑй клÑÑ
sh_avail integer, -- ÑиÑло имеÑÑиÑ
ÑÑ Ð¿Ð°Ñ
slcolor text, -- пÑедпоÑиÑаемÑй ÑÐ²ÐµÑ ÑнÑÑков
slminlen real, -- минималÑÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° ÑнÑÑков
slmaxlen real, -- макÑималÑÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° ÑнÑÑков
slunit text -- единиÑа длинÑ
);
CREATE TABLE shoelace_data (
sl_name text, -- пеÑвиÑнÑй клÑÑ
sl_avail integer, -- ÑиÑло имеÑÑиÑ
ÑÑ Ð¿Ð°Ñ
sl_color text, -- ÑÐ²ÐµÑ ÑнÑÑков
sl_len real, -- длина ÑнÑÑков
sl_unit text -- единиÑа длинÑ
);
CREATE TABLE unit (
un_name text, -- пеÑвиÑнÑй клÑÑ
un_fact real -- коÑÑÑиÑÐ¸ÐµÐ½Ñ Ð´Ð»Ñ Ð¿ÐµÑевода в Ñм
);Ðак можно догадаÑÑÑÑ, в Ð½Ð¸Ñ Ñ ÑанÑÑÑÑ Ð´Ð°Ð½Ð½Ñе обÑвной ÑабÑики.
ÐÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑоздаÑÑÑÑ Ñак:
CREATE VIEW shoe AS
SELECT sh.shoename,
sh.sh_avail,
sh.slcolor,
sh.slminlen,
sh.slminlen * un.un_fact AS slminlen_cm,
sh.slmaxlen,
sh.slmaxlen * un.un_fact AS slmaxlen_cm,
sh.slunit
FROM shoe_data sh, unit un
WHERE sh.slunit = un.un_name;
CREATE VIEW shoelace AS
SELECT s.sl_name,
s.sl_avail,
s.sl_color,
s.sl_len,
s.sl_unit,
s.sl_len * u.un_fact AS sl_len_cm
FROM shoelace_data s, unit u
WHERE s.sl_unit = u.un_name;
CREATE VIEW shoe_ready AS
SELECT rsh.shoename,
rsh.sh_avail,
rsl.sl_name,
rsl.sl_avail,
least(rsh.sh_avail, rsl.sl_avail) AS total_avail
FROM shoe rsh, shoelace rsl
WHERE rsl.sl_color = rsh.slcolor
AND rsl.sl_len_cm >= rsh.slminlen_cm
AND rsl.sl_len_cm <= rsh.slmaxlen_cm; Ðоманда CREATE VIEW Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ shoelace (Ñамого пÑоÑÑого из имеÑÑиÑ
ÑÑ) ÑоздаÑÑ Ð¾ÑноÑение shoelace и запиÑÑ Ð² pg_rewrite о пÑавиле пеÑезапиÑи, коÑоÑое должно пÑименÑÑÑÑÑ, когда в запÑоÑе на вÑбоÑÐºÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвÑеÑÑÑ Ð¾ÑноÑение shoelace. ÐÐ»Ñ ÑÑого пÑавила не задаÑÑÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (о ниÑ
ÑаÑÑказÑваеÑÑÑ Ð½Ð¸Ð¶Ðµ, в опиÑании пÑавил не Ð´Ð»Ñ SELECT, Ñак как пÑавила SELECT в наÑÑоÑÑее бÑваÑÑ ÑолÑко безÑÑловнÑми) и оно дейÑÑвÑÐµÑ Ð² Ñежиме INSTEAD. ÐамеÑÑÑе, ÑÑо ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾ÑлиÑаÑÑÑÑ Ð¾Ñ ÑÑловий ÑилÑÑÑа запÑоÑа, напÑимеÑ, дейÑÑвие Ð´Ð»Ñ Ð½Ð°Ñего пÑавила ÑодеÑÐ¶Ð¸Ñ ÑÑловие ÑилÑÑÑа. ÐейÑÑвие пÑавила вÑÑажаеÑÑÑ Ð¾Ð´Ð½Ð¸Ð¼ деÑевом запÑоÑа, коÑоÑое ÑвлÑеÑÑÑ ÐºÐ¾Ð¿Ð¸ÐµÐ¹ опеÑаÑоÑа SELECT в команде, ÑоздаÑÑей пÑедÑÑавление.
ÐÑимеÑание
Ðва дополниÑелÑнÑÑ
ÑлеменÑа ÑпиÑка оÑноÑений NEW и OLD, коÑоÑÑе можно ÑвидеÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑей ÑÑÑоке pg_rewrite, не пÑедÑÑавлÑÑÑ Ð¸Ð½ÑеÑеÑа Ð´Ð»Ñ Ð¿Ñавил SELECT.
СейÑÐ°Ñ Ð¼Ñ Ð½Ð°Ð¿Ð¾Ð»Ð½Ð¸Ð¼ ÑаблиÑÑ unit (единиÑÑ Ð¸Ð·Ð¼ÐµÑениÑ), shoe_data (даннÑе о ÑÑÑлÑÑ
) и shoelace_data (даннÑе о ÑнÑÑкаÑ
) и вÑполним пÑоÑÑой запÑÐ¾Ñ Ðº пÑедÑÑавлениÑ:
INSERT INTO unit VALUES ('cm', 1.0);
INSERT INTO unit VALUES ('m', 100.0);
INSERT INTO unit VALUES ('inch', 2.54);
INSERT INTO shoe_data VALUES ('sh1', 2, 'black', 70.0, 90.0, 'cm');
INSERT INTO shoe_data VALUES ('sh2', 0, 'black', 30.0, 40.0, 'inch');
INSERT INTO shoe_data VALUES ('sh3', 4, 'brown', 50.0, 65.0, 'cm');
INSERT INTO shoe_data VALUES ('sh4', 3, 'brown', 40.0, 50.0, 'inch');
INSERT INTO shoelace_data VALUES ('sl1', 5, 'black', 80.0, 'cm');
INSERT INTO shoelace_data VALUES ('sl2', 6, 'black', 100.0, 'cm');
INSERT INTO shoelace_data VALUES ('sl3', 0, 'black', 35.0, 'inch');
INSERT INTO shoelace_data VALUES ('sl4', 8, 'black', 40.0, 'inch');
INSERT INTO shoelace_data VALUES ('sl5', 4, 'brown', 1.0, 'm');
INSERT INTO shoelace_data VALUES ('sl6', 0, 'brown', 0.9, 'm');
INSERT INTO shoelace_data VALUES ('sl7', 7, 'brown', 60, 'cm');
INSERT INTO shoelace_data VALUES ('sl8', 1, 'brown', 40, 'inch');
SELECT * FROM shoelace;
sl_name | sl_avail | sl_color | sl_len | sl_unit | sl_len_cm
-----------+----------+----------+--------+---------+-----------
sl1 | 5 | black | 80 | cm | 80
sl2 | 6 | black | 100 | cm | 100
sl7 | 7 | brown | 60 | cm | 60
sl3 | 0 | black | 35 | inch | 88.9
sl4 | 8 | black | 40 | inch | 101.6
sl8 | 1 | brown | 40 | inch | 101.6
sl5 | 4 | brown | 1 | m | 100
sl6 | 0 | brown | 0.9 | m | 90
(8 rows)ÐÑо ÑамÑй пÑоÑÑой запÑÐ¾Ñ SELECT, коÑоÑÑй можно вÑполниÑÑ Ñ Ð½Ð°Ñими пÑедÑÑавлениÑми, и Ð¼Ñ Ð²Ð¾ÑполÑзÑемÑÑ ÑÑим, ÑÑÐ¾Ð±Ñ Ð¾Ð±ÑÑÑниÑÑ Ð°Ð·Ñ Ð¿Ñавил пÑедÑÑавлений. ÐапÑÐ¾Ñ SELECT * FROM shoelace инÑеÑпÑеÑиÑÑеÑÑÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑоÑом запÑоÑов и пÑеобÑазÑеÑÑÑ Ð² деÑево запÑоÑа:
SELECT shoelace.sl_name, shoelace.sl_avail,
shoelace.sl_color, shoelace.sl_len,
shoelace.sl_unit, shoelace.sl_len_cm
FROM shoelace shoelace; ÐÑо деÑево пеÑедаÑÑÑÑ Ð² ÑиÑÑÐµÐ¼Ñ Ð¿Ñавил, коÑоÑÐ°Ñ Ð¿ÑоÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ ÑпиÑÐºÑ Ð¾ÑноÑений и пÑовеÑÑеÑ, еÑÑÑ Ð»Ð¸ какие-либо пÑавила Ð´Ð»Ñ ÑÑиÑ
оÑноÑений. ÐбÑабаÑÑÐ²Ð°Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¾ÑноÑÐµÐ½Ð¸Ñ shoelace (ÑейÑÐ°Ñ Ð¾Ð½ единÑÑвеннÑй), ÑиÑÑема пÑавил наÑ
Ð¾Ð´Ð¸Ñ Ð¿Ñавило _RETURN Ñ Ð´ÐµÑевом запÑоÑа:
SELECT s.sl_name, s.sl_avail,
s.sl_color, s.sl_len, s.sl_unit,
s.sl_len * u.un_fact AS sl_len_cm
FROM shoelace old, shoelace new,
shoelace_data s, unit u
WHERE s.sl_unit = u.un_name;ЧÑÐ¾Ð±Ñ ÑазвеÑнÑÑÑ Ð¿ÑедÑÑавление, Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ пеÑезапиÑи пÑоÑÑо ÑоÑмиÑÑÐµÑ Ð½Ð¾Ð²Ñй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð»Ñ ÑпиÑка оÑноÑений â подзапÑоÑ, ÑодеÑжаÑий деÑево дейÑÑÐ²Ð¸Ñ Ð¿Ñавила, и подÑÑавлÑÐµÑ ÑÑÐ¾Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ð¼ÐµÑÑо иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾, на коÑоÑÑй ÑÑÑлалоÑÑ Ð¿ÑедÑÑавление. ÐолÑÑивÑееÑÑ Ð¿ÐµÑезапиÑанное деÑево запÑоÑа бÑÐ´ÐµÑ Ð¿Ð¾ÑÑи Ñаким как деÑево запÑоÑа:
SELECT shoelace.sl_name, shoelace.sl_avail,
shoelace.sl_color, shoelace.sl_len,
shoelace.sl_unit, shoelace.sl_len_cm
FROM (SELECT s.sl_name,
s.sl_avail,
s.sl_color,
s.sl_len,
s.sl_unit,
s.sl_len * u.un_fact AS sl_len_cm
FROM shoelace_data s, unit u
WHERE s.sl_unit = u.un_name) shoelace; Ðднако еÑÑÑ Ð¾Ð´Ð½Ð¾ ÑазлиÑие: в ÑпиÑке оÑноÑений подзапÑоÑа бÑдÑÑ ÑодеÑжаÑÑÑÑ Ð´Ð²Ð° дополниÑелÑнÑÑ
ÑлеменÑа: shoelace old и shoelace new. ÐÑи ÑлеменÑÑ Ð½Ðµ пÑинимаÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенного ÑÑаÑÑÐ¸Ñ Ð² запÑоÑе, Ñак как они не задейÑÑÐ²Ð¾Ð²Ð°Ð½Ñ Ð² деÑеве ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð·Ð°Ð¿ÑоÑа и в Ñелевом ÑпиÑке. ÐеÑ
анизм пеÑезапиÑи иÑполÑзÑÐµÑ Ð¸Ñ
Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии о пÑовеÑке пÑав доÑÑÑпа, коÑоÑÐ°Ñ Ð¸Ð·Ð½Ð°ÑалÑно Ñ
ÑанилаÑÑ Ð² ÑлеменÑе, ÑказÑваÑÑем на пÑедÑÑавление. Таким обÑазом, иÑполниÑÐµÐ»Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð¿ÑовеÑÑÑÑ, Ð¸Ð¼ÐµÐµÑ Ð»Ð¸ полÑзоваÑÐµÐ»Ñ Ð½ÐµÐ¾Ð±Ñ
одимÑе пÑава Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к пÑедÑÑавлениÑ, Ñ
оÑÑ Ð² пеÑезапиÑанном запÑоÑе ÑÑо пÑедÑÑавление не ÑигÑÑиÑÑÐµÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно.
Так бÑло пÑименено пеÑвое пÑавило. СиÑÑема пÑавил пÑÐ¾Ð´Ð¾Ð»Ð¶Ð¸Ñ Ð¿ÑовеÑÐºÑ Ð¾ÑÑавÑиÑ
ÑÑ ÑлеменÑов ÑпиÑка оÑноÑений на веÑÑ
нем ÑÑовне запÑоÑа (в данном ÑлÑÑае ÑакиÑ
ÑлеменÑов неÑ) и ÑекÑÑÑивно пÑовеÑÐ¸Ñ ÑлеменÑÑ ÑпиÑка оÑноÑений в добавленном подзапÑоÑе, не ÑÑÑлаÑÑÑÑ Ð»Ð¸ они на пÑедÑÑавлениÑ. (Ðо old и new ÑазвоÑаÑиваÑÑÑÑ Ð½Ðµ бÑдÑÑ â инаÑе Ð¼Ñ Ð¿Ð¾Ð»ÑÑили Ð±Ñ Ð±ÐµÑконеÑнÑÑ ÑекÑÑÑиÑ!) Ð ÑÑом пÑимеÑе Ð´Ð»Ñ shoelace_data и unit Ð½ÐµÑ Ð¿Ñавил пеÑезапиÑи, Ñак ÑÑо пеÑезапиÑÑ Ð·Ð°Ð²ÐµÑÑаеÑÑÑ Ð¸ ÑезÑлÑÑаÑ, полÑÑеннÑй вÑÑе, пеÑедаÑÑÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑикÑ.
СейÑÐ°Ñ Ð¼Ñ Ñ Ð¾Ñим напиÑаÑÑ Ð·Ð°Ð¿ÑоÑ, коÑоÑÑй вÑбиÑÐ°ÐµÑ ÑÑÑли из имеÑÑÐ¸Ñ ÑÑ Ð² даннÑй моменÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ ÐµÑÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие ÑнÑÑки (по ÑвеÑÑ Ð¸ длине) и ÑиÑло гоÑовÑÑ Ð¿Ð°Ñ Ð±Ð¾Ð»ÑÑе или Ñавно двÑм.
SELECT * FROM shoe_ready WHERE total_avail >= 2; shoename | sh_avail | sl_name | sl_avail | total_avail ----------+----------+---------+----------+------------- sh1 | 2 | sl1 | 5 | 2 sh3 | 4 | sl7 | 7 | 4 (2 rows)
Ðа ÑÑÐ¾Ñ Ñаз анализаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа вÑÐ²Ð¾Ð´Ð¸Ñ Ñакое деÑево:
SELECT shoe_ready.shoename, shoe_ready.sh_avail,
shoe_ready.sl_name, shoe_ready.sl_avail,
shoe_ready.total_avail
FROM shoe_ready shoe_ready
WHERE shoe_ready.total_avail >= 2; ÐеÑвое пÑавило пÑименÑеÑÑÑ Ðº пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ shoe_ready и в ÑезÑлÑÑаÑе полÑÑаеÑÑÑ Ð´ÐµÑево запÑоÑа:
SELECT shoe_ready.shoename, shoe_ready.sh_avail,
shoe_ready.sl_name, shoe_ready.sl_avail,
shoe_ready.total_avail
FROM (SELECT rsh.shoename,
rsh.sh_avail,
rsl.sl_name,
rsl.sl_avail,
least(rsh.sh_avail, rsl.sl_avail) AS total_avail
FROM shoe rsh, shoelace rsl
WHERE rsl.sl_color = rsh.slcolor
AND rsl.sl_len_cm >= rsh.slminlen_cm
AND rsl.sl_len_cm <= rsh.slmaxlen_cm) shoe_ready
WHERE shoe_ready.total_avail >= 2; ÐодобнÑм обÑазом, пÑавила Ð´Ð»Ñ shoe и shoelace подÑÑавлÑÑÑÑÑ Ð² ÑпиÑок оÑноÑений, ÑÑо даÑÑ Ð¾ÐºÐ¾Ð½ÑаÑелÑное деÑево запÑоÑа:
SELECT shoe_ready.shoename, shoe_ready.sh_avail,
shoe_ready.sl_name, shoe_ready.sl_avail,
shoe_ready.total_avail
FROM (SELECT rsh.shoename,
rsh.sh_avail,
rsl.sl_name,
rsl.sl_avail,
least(rsh.sh_avail, rsl.sl_avail) AS total_avail
FROM (SELECT sh.shoename,
sh.sh_avail,
sh.slcolor,
sh.slminlen,
sh.slminlen * un.un_fact AS slminlen_cm,
sh.slmaxlen,
sh.slmaxlen * un.un_fact AS slmaxlen_cm,
sh.slunit
FROM shoe_data sh, unit un
WHERE sh.slunit = un.un_name) rsh,
(SELECT s.sl_name,
s.sl_avail,
s.sl_color,
s.sl_len,
s.sl_unit,
s.sl_len * u.un_fact AS sl_len_cm
FROM shoelace_data s, unit u
WHERE s.sl_unit = u.un_name) rsl
WHERE rsl.sl_color = rsh.slcolor
AND rsl.sl_len_cm >= rsh.slminlen_cm
AND rsl.sl_len_cm <= rsh.slmaxlen_cm) shoe_ready
WHERE shoe_ready.total_avail > 2;ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð½ÐµÑÑÑекÑивнÑм, но планиÑовÑик пÑеобÑазÑÐµÑ ÑÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð² одноÑÑовневое деÑево, «подÑÑгиваÑ» подзапÑоÑÑ Ð² главнÑй запÑоÑ, а заÑем планиÑÑÐµÑ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñак же, как и пÑи Ñвной запиÑи Ñ ÑоединениÑми. Таким обÑазом, ÑпÑоÑение деÑева запÑоÑов ÑвлÑеÑÑÑ Ð¾Ð¿ÑимизаÑией, коÑоÑÐ°Ñ Ð¿ÑоизводиÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо Ð¾Ñ Ð¿ÐµÑезапиÑи запÑоÑов.
37.2.2. ÐÑавила пÑедÑÑавлений не Ð´Ð»Ñ SELECT
Ðо ÑÑого в опиÑании пÑавил пÑедÑÑавлений не заÑÑагивалиÑÑ Ð´Ð²Ð° компоненÑа деÑева запÑоÑов â Ñип ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¸ ÑезÑлÑÑиÑÑÑÑее оÑноÑение. Ðа Ñамом деле, Ñип ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð½Ðµ важен Ð´Ð»Ñ Ð¿Ñавил пÑедÑÑавлениÑ, но ÑезÑлÑÑиÑÑÑÑее оÑноÑение Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð²Ð»Ð¸ÑÑÑ Ð½Ð° ÑабоÑÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° пеÑезапиÑи, поÑÐ¾Ð¼Ñ ÑÑо еÑли ÑÑо пÑедÑÑавление, ÑÑебÑÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе опеÑаÑии.
ÐÑÑÑ ÑолÑко неÑколÑко оÑлиÑий Ð¼ÐµÐ¶Ð´Ñ Ð´ÐµÑевом запÑоÑа Ð´Ð»Ñ SELECT и деÑевом Ð´Ð»Ñ Ð´ÑÑгой командÑ. ÐÑевидно, Ñ Ð½Ð¸Ñ
ÑазлиÑнÑе ÑÐ¸Ð¿Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, и Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, оÑлиÑной Ð¾Ñ SELECT, ÑезÑлÑÑиÑÑÑÑее оÑноÑение ÑказÑÐ²Ð°ÐµÑ Ð½Ð° ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² ÑпиÑке оÑноÑений, кÑда должен попаÑÑÑ ÑезÑлÑÑаÑ. ÐÑе оÑÑалÑнÑе компоненÑÑ Ð² ÑоÑноÑÑи Ñе же. ÐоÑÑомÑ, напÑимеÑ, еÑли взÑÑÑ ÑаблиÑÑ t1 и t2 Ñо ÑÑолбÑами a и b, деÑевÑÑ Ð·Ð°Ð¿ÑоÑов Ð´Ð»Ñ ÑÑиÑ
опеÑаÑоÑов:
SELECT t2.b FROM t1, t2 WHERE t1.a = t2.a; UPDATE t1 SET b = t2.b FROM t2 WHERE t1.a = t2.a;
бÑдÑÑ Ð¿ÑакÑиÑеÑки одинаковÑми. Ð ÑаÑÑноÑÑи:
СпиÑки оÑноÑений ÑодеÑÐ¶Ð°Ñ ÑлеменÑÑ Ð´Ð»Ñ ÑаблиÑ
t1иt2.ÐÑÑ Ð¾Ð´Ð½Ñе ÑпиÑки ÑодеÑÐ¶Ð°Ñ Ð¾Ð´Ð½Ñ Ð¿ÐµÑеменнÑÑ, ÑказÑваÑÑÑÑ Ð½Ð° ÑÑолбеÑ
bÑлеменÑа-оÑноÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑаблиÑÑt2.ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÑловий ÑÑавниваÑÑ ÑÑолбÑÑ
aÐ¾Ð±Ð¾Ð¸Ñ ÑлеменÑов-оÑноÑений на ÑавенÑÑво.ÐеÑевÑÑ Ñоединений показÑваÑÑ Ð¿ÑоÑÑое Ñоединение междÑ
t1иt2.
Ðак ÑледÑÑвие, Ð´Ð»Ñ Ð¾Ð±Ð¾Ð¸Ñ
деÑевÑев ÑÑÑоÑÑÑÑ Ð¿Ð¾Ñ
ожие Ð¿Ð»Ð°Ð½Ñ Ð²ÑполнениÑ, Ñ Ñоединением двÑÑ
ÑаблиÑ. ÐÐ»Ñ UPDATE планиÑовÑик добавлÑÐµÑ Ð² вÑÑ
одной ÑпиÑок недоÑÑаÑÑие ÑÑолбÑÑ Ð¸Ð· t1 и оконÑаÑелÑное деÑево ÑÑановиÑÑÑ Ñаким:
UPDATE t1 SET a = t1.a, b = t2.b FROM t2 WHERE t1.a = t2.a;
Ð ÑезÑлÑÑаÑе иÑполниÑелÑ, обÑабаÑÑваÑÑий Ñоединение, вÑдаÑÑ ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑаÑ, ÑÑо и запÑоÑ:
SELECT t1.a, t2.b FROM t1, t2 WHERE t1.a = t2.a;
Ðо Ñ UPDATE еÑÑÑ Ð¼Ð°Ð»ÐµÐ½ÑÐºÐ°Ñ Ð¿Ñоблема: ÑаÑÑÑ Ð¿Ð»Ð°Ð½Ð° иÑполниÑелÑ, в коÑоÑой вÑполнÑеÑÑÑ Ñоединение, не пÑедÑÑавлÑеÑ, Ð´Ð»Ñ Ñего пÑедназнаÑÐµÐ½Ñ ÑезÑлÑÑаÑÑ ÑоединениÑ. Ðна пÑоÑÑо вÑдаÑÑ ÑезÑлÑÑиÑÑÑÑий Ð½Ð°Ð±Ð¾Ñ ÑÑÑок. ФакÑиÑеÑки еÑÑÑ Ð¾Ð´Ð½Ð° команда SELECT, а дÑÑгаÑ, UPDATE, обÑабаÑÑваеÑÑÑ Ð¸ÑполниÑелем вÑÑе, где он Ñже знаеÑ, ÑÑо ÑÑо команда UPDATE и ÑÑо ÑезÑлÑÑÐ°Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ попаÑÑÑ Ð² ÑаблиÑÑ t1. Ðо какие из ÑÑÑок ÑаблиÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð¼ÐµÐ½ÑÑÑÑÑ Ð½Ð¾Ð²Ñми?
ÐÐ»Ñ ÑеÑÐµÐ½Ð¸Ñ ÑÑой пÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð² вÑÑ
одной ÑпиÑок опеÑаÑоÑов UPDATE (и DELETE) добавлÑеÑÑÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ ÑлеменÑ: иденÑиÑикаÑÐ¾Ñ ÑекÑÑего коÑÑежа (Current Tuple ID, CTID). ÐÑо ÑиÑÑемнÑй ÑÑолбеÑ, ÑодеÑжаÑий Ð½Ð¾Ð¼ÐµÑ Ð±Ð»Ð¾ÐºÐ° в Ñайле и позиÑÐ¸Ñ ÑÑÑоки в блоке. ÐÐ½Ð°Ñ ÑаблиÑÑ, по CTID можно полÑÑиÑÑ Ð¸ÑÑ
однÑÑ ÑÑÑÐ¾ÐºÑ Ð² t1, подлежаÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ. С добавленнÑм в вÑÑ
одной ÑпиÑок CTID запÑÐ¾Ñ ÑакÑиÑеÑки вÑглÑÐ´Ð¸Ñ Ñак:
SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a;
ТепеÑÑ Ð¼Ñ Ð¿ÐµÑейдÑм еÑÑ Ðº одной оÑобенноÑÑи Postgres Pro. СÑаÑÑе ÑÑÑоки ÑаблиÑÑ Ð½Ðµ пеÑепиÑÑваÑÑÑÑ, поÑÑÐ¾Ð¼Ñ ROLLBACK вÑполнÑеÑÑÑ Ð±ÑÑÑÑо. С командой UPDATE в ÑаблиÑÑ Ð²ÑÑавлÑеÑÑÑ Ð½Ð¾Ð²Ð°Ñ ÑÑÑока ÑезÑлÑÑаÑа (без CTID) и в заголовке ÑÑаÑой ÑÑÑоки, на коÑоÑÑÑ ÑказÑÐ²Ð°ÐµÑ CTID, в Ð¿Ð¾Ð»Ñ cmax и xmax запиÑÑваÑÑÑÑ ÑекÑÑий ÑÑÑÑÑик команд и иденÑиÑикаÑÐ¾Ñ ÑекÑÑей ÑÑанзакÑии. Таким обÑазом, ÑÑаÑÐ°Ñ ÑÑÑока оказÑваеÑÑÑ ÑкÑÑÑой и поÑле ÑикÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑанзакÑии пÑоÑеÑÑ Ð¾ÑиÑÑки Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ¾Ð½ÑаÑелÑно ÑдалиÑÑ Ð½ÐµÐ°ÐºÑÑалÑнÑÑ Ð²ÐµÑÑÐ¸Ñ ÑÑÑоки.
ÐÐ½Ð°Ñ Ð²ÑÑ ÑÑо, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пÑименÑÑÑ Ð¿Ñавила пÑедÑÑавлений абÑолÑÑно Ñаким же обÑазом к лÑбой команде â Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ ÑазлиÑий неÑ.
37.2.3. ÐÑеимÑÑеÑÑва пÑедÑÑавлений в Postgres Pro
ÐÑÑе бÑло показано, как ÑиÑÑема пÑавил внедÑÑÐµÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿ÑедÑÑавлений в иÑÑ
одное деÑево запÑоÑа. Ðо вÑоÑом пÑимеÑе пÑоÑÑой запÑÐ¾Ñ SELECT к Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñоздал оконÑаÑелÑное деÑево запÑоÑа, ÑоединÑÑÑее 4 ÑаблиÑÑ (ÑаблиÑа unit иÑполÑзовалаÑÑ Ð´Ð²Ð°Ð¶Ð´Ñ Ñ ÑазнÑми именами).
ÐÑеимÑÑеÑÑво ÑеализаÑии пÑедÑÑавлений ÑеÑез ÑиÑÑÐµÐ¼Ñ Ð¿Ñавил заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо планиÑовÑик полÑÑÐ°ÐµÑ Ð² одном деÑеве запÑоÑа вÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑаблиÑÐ°Ñ , коÑоÑÑе нÑжно пÑоÑиÑаÑÑ, о Ñом, как ÑвÑÐ·Ð°Ð½Ñ ÑÑи ÑаблиÑÑ, об ÑÑловиÑÑ Ð² пÑедÑÑавлениÑÑ , а Ñакже об ÑÑловиÑÑ , заданнÑÑ Ð² иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ запÑоÑе. РвÑÑ ÑÑо Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÑо, когда Ñам иÑÑ Ð¾Ð´Ð½Ñй запÑÐ¾Ñ Ð¿ÑедÑÑавлÑÐµÑ Ñобой Ñоединение пÑедÑÑавлений. ÐланиÑовÑик должен вÑбÑаÑÑ Ð»ÑÑÑий ÑпоÑоб вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа, и Ñем болÑÑе инÑоÑмаÑии он полÑÑиÑ, Ñем лÑÑÑе Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÐµÐ³Ð¾ вÑбоÑ. Ð Ñо, как в Postgres Pro Ñеализована ÑиÑÑема пÑавил, гаÑанÑиÑÑеÑ, ÑÑо ÐµÐ¼Ñ Ð¿Ð¾ÑÑÑÐ¿Ð°ÐµÑ Ð²ÑÑ Ð¸Ð½ÑоÑмаÑиÑ, ÑобÑÐ°Ð½Ð½Ð°Ñ Ð¾ запÑоÑе на даннÑй моменÑ.
37.2.4. Ðзменение пÑедÑÑавлениÑ
Ðо ÑÑо пÑоизойдÑÑ, еÑли запиÑаÑÑ Ð¸Ð¼Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² каÑеÑÑве Ñелевого оÑноÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ INSERT, UPDATE или DELETE? ÐÑли пÑоделаÑÑ Ð¿Ð¾Ð´ÑÑановки, опиÑаннÑе вÑÑе, бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑено деÑево запÑоÑа, в коÑоÑом ÑезÑлÑÑиÑÑÑÑее оÑноÑение ÑказÑÐ²Ð°ÐµÑ Ð½Ð° ÑлеменÑ-подзапÑоÑ, ÑÑо не бÑÐ´ÐµÑ ÑабоÑаÑÑ. Ðднако Postgres Pro даÑÑ ÑÑд возможноÑÑей, ÑÑÐ¾Ð±Ñ ÑделаÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÑемÑми.
ÐÑли подзапÑÐ¾Ñ Ð²ÑбиÑÐ°ÐµÑ Ð´Ð°Ð½Ð½Ñе из одного базового оÑноÑÐµÐ½Ð¸Ñ Ð¸ он доÑÑаÑоÑно пÑоÑÑ, меÑ
анизм пеÑезапиÑи Ð¼Ð¾Ð¶ÐµÑ Ð°Ð²ÑомаÑиÑеÑки замениÑÑ ÐµÐ³Ð¾ нижележаÑим базовÑм оÑноÑением, ÑÑÐ¾Ð±Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ INSERT, UPDATE или DELETE обÑаÑалиÑÑ Ðº Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¼Ñ Ð¾ÑноÑениÑ. ÐÑедÑÑавлениÑ, «доÑÑаÑоÑно пÑоÑÑÑе» Ð´Ð»Ñ ÑÑого, назÑваÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки изменÑемÑми. ÐодÑобнее Ð²Ð¸Ð´Ñ Ð¿ÑедÑÑавлений, коÑоÑÑе могÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки, опиÑÐ°Ð½Ñ Ð² CREATE VIEW.
ÐÑÑ Ð·Ð°Ð´Ð°ÑÑ Ñакже можно ÑеÑиÑÑ, Ñоздав ÑÑÐ¸Ð³Ð³ÐµÑ INSTEAD OF Ð´Ð»Ñ Ð¿ÑедÑÑавлениÑ. Ð ÑÑом ÑлÑÑае пеÑезапиÑÑ Ð±ÑÐ´ÐµÑ ÑабоÑаÑÑ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ по-дÑÑгомÑ. ÐÐ»Ñ INSERT меÑ
анизм пеÑезапиÑи не Ð´ÐµÐ»Ð°ÐµÑ Ñ Ð¿ÑедÑÑавлением ниÑего, оÑÑавлÑÑ ÐµÐ³Ð¾ ÑезÑлÑÑиÑÑÑÑим оÑноÑением запÑоÑа. ÐÐ»Ñ UPDATE и DELETE ÐµÐ¼Ñ Ð¿Ð¾-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð¿ÑидÑÑÑÑ ÑазвоÑаÑиваÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¿ÑедÑÑавлениÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Â«ÑÑаÑÑе» ÑÑÑоки, коÑоÑÑе ÑÑа команда попÑÑаеÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¸Ð»Ð¸ ÑдалиÑÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¿ÑедÑÑавление ÑазвоÑаÑиваеÑÑÑ ÐºÐ°Ðº обÑÑно, но в запÑÐ¾Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑеÑÑÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑпиÑка оÑноÑений, ÑказÑваÑÑий на пÑедÑÑавление в Ñоли ÑезÑлÑÑиÑÑÑÑего оÑноÑениÑ.
ÐÑи ÑÑом Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¿Ñоблема иденÑиÑикаÑии ÑÑÑок в пÑедÑÑавлении, подлежаÑиÑ
изменениÑ. ÐÑпомниÑе, ÑÑо когда ÑезÑлÑÑиÑÑÑÑее оÑноÑение ÑвлÑеÑÑÑ ÑаблиÑей, в вÑÑ
одной ÑпиÑок добавлÑеÑÑÑ ÑпеÑиалÑное поле CTID, ÑказÑваÑÑее на ÑизиÑеÑкое ÑаÑположение изменÑемÑÑ
ÑÑÑок. Ðо ÑÑо не бÑÐ´ÐµÑ ÑабоÑаÑÑ, когда ÑезÑлÑÑиÑÑÑÑее оÑноÑение â пÑедÑÑавление, Ñак как в пÑедÑÑавлениÑÑ
Ð½ÐµÑ CTID, поÑÐ¾Ð¼Ñ ÑÑо иÑ
ÑÑÑоки ÑизиÑеÑки нигде не наÑ
одÑÑÑÑ. ÐмеÑÑо ÑÑого, Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑий UPDATE или DELETE в вÑÑ
одной ÑпиÑок добавлÑеÑÑÑ ÑпеÑиалÑнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ wholerow (вÑÑ ÑÑÑока), коÑоÑÑй ÑазвоÑаÑиваеÑÑÑ Ð² ÑодеÑжимое вÑеÑ
ÑÑолбÑов пÑедÑÑавлениÑ. ÐÑполÑзÑÑ ÑÑÐ¾Ñ ÑлеменÑ, иÑполниÑÐµÐ»Ñ Ð¿ÐµÑедаÑÑ ÑÑÑÐ¾ÐºÑ Â«old» в ÑÑÐ¸Ð³Ð³ÐµÑ INSTEAD OF. Ðакие именно ÑÑÑоки Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÑÑ ÑакÑиÑеÑки, бÑÐ´ÐµÑ ÑеÑаÑÑ Ñам ÑÑиггеÑ, иÑÑ
Ð¾Ð´Ñ Ð¸Ð· полÑÑеннÑÑ
знаÑений ÑÑаÑÑÑ
и новÑÑ
ÑÑÑок.
ÐÑоме Ñого, полÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÑеделиÑÑ Ð¿Ñавила INSTEAD, в коÑоÑÑÑ
задаÑÑ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ð·Ð°Ð¼ÐµÐ½Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ INSERT, UPDATE и DELETE Ñ Ð¿ÑедÑÑавлением. ÐÑи пÑавила обÑÑно пÑеобÑазÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² дÑÑгÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, изменÑÑÑÑÑ Ð¾Ð´Ð½Ñ Ð¸Ð»Ð¸ неÑколÑко ÑаблиÑ, а не пÑедÑÑавление. ÐÑа Ñема оÑвеÑаеÑÑÑ Ð² Разделе 37.4.
ÐамеÑÑÑе, ÑÑо Ñакие пÑавила вÑÑиÑлÑÑÑÑÑ ÑнаÑала, пеÑезапиÑÑÐ²Ð°Ñ Ð¸ÑÑ
однÑй запÑÐ¾Ñ Ð´Ð¾ Ñого, как он бÑÐ´ÐµÑ Ð¿Ð»Ð°Ð½Ð¸ÑоваÑÑÑÑ Ð¸ вÑполнÑÑÑÑÑ. ÐоÑÑомÑ, еÑли Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð¸ ÑÑиггеÑÑ INSTEAD OF, и пÑавила Ð´Ð»Ñ INSERT, UPDATE или DELETE, ÑнаÑала вÑÑиÑлÑÑÑÑÑ Ð¿Ñавила, а в завиÑимоÑÑи Ð¾Ñ Ð¸Ñ
дейÑÑвиÑ, ÑÑиггеÑÑ Ð¼Ð¾Ð³ÑÑ Ð½Ðµ вÑзÑваÑÑÑÑ Ð²Ð¾Ð²Ñе.
ÐвÑомаÑиÑеÑÐºÐ°Ñ Ð¿ÐµÑезапиÑÑ Ð·Ð°Ð¿ÑоÑов INSERT, UPDATE или DELETE Ñ Ð¿ÑоÑÑÑми пÑедÑÑавлениÑми вÑегда пÑоизводиÑÑÑ Ð² поÑледнÑÑ Ð¾ÑеÑедÑ. Таким обÑазом, еÑли Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐµÑÑÑ Ð¿Ñавила или ÑÑиггеÑÑ, они пеÑеопÑеделÑÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ авÑомаÑиÑеÑки изменÑемÑÑ
пÑедÑÑавлений.
ÐÑли Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð¿Ñавила INSTEAD или ÑÑиггеÑÑ INSTEAD OF, и запÑÐ¾Ñ Ð½Ðµ ÑдаÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки пеÑепиÑаÑÑ Ð² виде обÑаÑÐµÐ½Ð¸Ñ Ðº нижележаÑÐµÐ¼Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¼Ñ Ð¾ÑноÑениÑ, Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¾Ñибка, поÑÐ¾Ð¼Ñ ÑÑо иÑполниÑÐµÐ»Ñ Ð½Ðµ ÑÐ¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ñакое пÑедÑÑавление.