CREATE RULE
CREATE RULE â ÑоздаÑÑ Ð¿Ñавило пеÑезапиÑи
СинÑакÑиÑ
CREATE [ OR REPLACE ] RULEимÑAS ONÑобÑÑиеTOимÑ_ÑаблиÑÑ[ WHEREÑÑловие] DO [ ALSO | INSTEAD ] { NOTHING |команда| (команда;команда... ) } ÐдеÑÑ Ð´Ð¾Ð¿ÑÑкаеÑÑÑÑобÑÑие: SELECT | INSERT | UPDATE | DELETE
ÐпиÑание
CREATE RULE ÑоздаÑÑ Ð¿Ñавило, пÑименÑемое к Ñказанной ÑаблиÑе или пÑедÑÑавлениÑ. CREATE OR REPLACE RULE либо ÑоздаÑÑ Ð½Ð¾Ð²Ð¾Ðµ пÑавило, либо заменÑÐµÑ ÑÑÑеÑÑвÑÑÑее Ñ Ñем же именем Ð´Ð»Ñ Ñой же ÑаблиÑÑ.
СиÑÑема пÑавил PostgreSQL позволÑÐµÑ Ð¾Ð¿ÑеделиÑÑ Ð°Ð»ÑÑеÑнаÑивное дейÑÑвие, заменÑÑÑее опеÑаÑии добавлениÑ, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
в ÑаблиÑаÑ
Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. ÐÑÑбо говоÑÑ, пÑавило опиÑÑÐ²Ð°ÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе командÑ, коÑоÑÑе бÑдÑÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ñи вÑзове опÑеделÑнной ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнной ÑаблиÑÑ. ÐÑоме Ñого, пÑавило INSTEAD Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ Ð·Ð°Ð´Ð°Ð½Ð½ÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð´ÑÑгой, либо ÑделаÑÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð° не вÑполнÑлаÑÑ Ð²Ð¾Ð²Ñе. ÐÑавила Ñакже пÑименÑÑÑÑÑ Ð´Ð»Ñ ÑеализаÑии SQL-запÑоÑов. Ðажно понимаÑÑ, ÑÑо пÑавило ÑÑо ÑакÑиÑеÑки меÑ
анизм пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ (макÑоÑ). Ðаданное пÑеобÑазование Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÑо до наÑала вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ. Ðогда ÑÑебÑеÑÑÑ Ð²ÑполниÑÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑизиÑеÑкой ÑÑÑоки, ÑкоÑее вÑего, Ð´Ð»Ñ ÑÑого нÑжно пÑименÑÑÑ ÑÑиггеÑ, а не пÑавило. Ðолее подÑобно о ÑиÑÑеме пÑавил можно ÑзнаÑÑ Ð² Ðлаве 40.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð¿Ñавила ON SELECT можно пÑименÑÑÑ ÑолÑко к пÑедÑÑавлениÑм. (ÐÑименение Ñакого пÑавила к ÑаблиÑе пÑеобÑазÑÐµÑ ÑаблиÑÑ Ð² пÑедÑÑавление.) Такое пÑавило должно назÑваÑÑÑÑ "_RETURN", бÑÑÑ Ð±ÐµÐ·ÑÑловнÑм, Ñ Ñ
аÑакÑеÑиÑÑикой INSTEAD (вмеÑÑо иÑÑ
одного), и его дейÑÑÐ²Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑоÑÑоÑÑÑ Ð¸Ð· единÑÑвенной ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SELECT, опÑеделÑÑÑей видимое ÑодеÑжимое пÑедÑÑавлениÑ. (Само пÑедÑÑавление по ÑÑÑи ÑвлÑеÑÑÑ ÑикÑивной ÑаблиÑей без Ñ
ÑанилиÑа.) ÐÑÑÑе вÑего ÑаÑÑмаÑÑиваÑÑ Ñакое пÑавило как деÑÐ°Ð»Ñ ÑеализаÑии. ХоÑÑ Ð¿ÑедÑÑавление можно пеÑеопÑеделиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CREATE OR REPLACE RULE "_RETURN" AS ..., лÑÑÑе иÑполÑзоваÑÑ CREATE OR REPLACE VIEW.
С помоÑÑÑ Ð¿Ñавил можно ÑоздаÑÑ Ð¸Ð»Ð»ÑÐ·Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ñемого пÑедÑÑавлениÑ, опÑеделив пÑавила ON INSERT, ON UPDATE и ON DELETE (либо ÑолÑко Ñе, коÑоÑÑÑ
доÑÑаÑоÑно Ð´Ð»Ñ ÑеÑÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑавленной задаÑи) и заменив опеÑаÑии Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
в пÑедÑÑавлении ÑооÑвеÑÑÑвÑÑÑими дейÑÑвиÑми Ñ Ð´ÑÑгими ÑаблиÑами. ÐÑли ÑÑебÑеÑÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ INSERT RETURNING и подобнÑе емÑ, в каждое из ÑÑиÑ
пÑавило обÑзаÑелÑно нÑжно помеÑÑиÑÑ Ð¿Ð¾Ð´Ñ
одÑÑее пÑедложение RETURNING.
ÐÑполÑзование пÑавил Ñ ÑÑловиÑми Ð´Ð»Ñ ÑложнÑÑ
изменений пÑедÑÑавлений ÑвÑзано Ñ Ð¾Ð´Ð½Ð¸Ð¼ огÑаниÑением: Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ дейÑÑвиÑ, коÑоÑое Ð²Ñ Ñ
оÑиÑе ÑазÑеÑиÑÑ Ð´Ð»Ñ Ð¿ÑедÑÑавлениÑ, необÑ
одимо опÑеделиÑÑ Ð±ÐµÐ·ÑÑловное пÑавило INSTEAD. ÐÑли опÑеделено ÑолÑко ÑÑловное пÑавило, или пÑавило не Ñипа INSTEAD, ÑиÑÑема оÑвеÑÐ³Ð½ÐµÑ Ð¿Ð¾Ð¿ÑÑки вÑполниÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, пÑедполагаÑ, ÑÑо в некоÑоÑÑÑ
ÑлÑÑаÑÑ
Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ ÑвеÑÑиÑÑ Ðº опеÑаÑиÑм Ñ ÑикÑивной нижележаÑей ÑаблиÑей. ÐÑи желании обÑабоÑаÑÑ Ð²Ñе полезнÑе ÑлÑÑаи изменений в ÑÑловнÑÑ
пÑавилаÑ
, добавÑÑе безÑÑловное пÑавило DO INSTEAD NOTHING, ÑÑÐ¾Ð±Ñ ÑиÑÑема понимала, ÑÑо ей никогда не пÑидÑÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°ÑÑÑ ÑаблиÑÑ. ÐаÑем ÑоздайÑе ÑÑловнÑе пÑавила без ÑвойÑÑва INSTEAD; в ÑеÑ
ÑлÑÑаÑÑ
, когда они бÑдÑÑ Ð¿ÑименÑÑÑÑÑ, иÑ
дейÑÑÐ²Ð¸Ñ Ð±ÑдÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ Ðº дейÑÑÐ²Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ INSTEAD NOTHING. (Ðднако ÑÑÐ¾Ñ ÑпоÑоб в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ подÑ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ ÑеализаÑии запÑоÑов RETURNING.)
ÐÑимеÑание
ÐÑедÑÑавлениÑ, доÑÑаÑоÑно пÑоÑÑÑе Ð´Ð»Ñ ÑеализаÑии авÑомаÑиÑеÑкого Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ (Ñм. CREATE VIEW), могÑÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑемÑми без полÑзоваÑелÑÑÐºÐ¸Ñ Ð¿Ñавил. ХоÑÑ Ð²Ñ Ñем не менее можеÑе ÑоздаÑÑ Ñвное пÑавило, обÑÑно авÑомаÑиÑеÑкое пÑеобÑазование бÑÐ´ÐµÑ ÑабоÑаÑÑ Ð»ÑÑÑе Ñакого пÑавила.
ÐÑÑгаÑ, заÑлÑживаÑÑÐ°Ñ ÑаÑÑмоÑÑениÑ, алÑÑеÑнаÑива пÑавилам â ÑÑиггеÑÑ INSTEAD OF (Ñм. CREATE TRIGGER).
ÐаÑамеÑÑÑ
имÑÐÐ¼Ñ Ñоздаваемого пÑавила. Ðно должно оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼Ñн лÑбÑÑ Ð´ÑÑÐ³Ð¸Ñ Ð¿Ñавил Ð´Ð»Ñ Ñой же ÑаблиÑÑ. ÐÑи налиÑии неÑколÑÐºÐ¸Ñ Ð¿Ñавил Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑаблиÑÑ Ð¸ одного Ñипа ÑобÑÑÐ¸Ñ Ð¾Ð½Ð¸ пÑименÑÑÑÑÑ Ð² алÑавиÑном поÑÑдке.
ÑобÑÑиеТип ÑобÑÑиÑ:
SELECT,INSERT,UPDATEилиDELETE. ÐамеÑÑÑе, ÑÑо командÑINSERTÑ Ð¿ÑедложениемON CONFLICTнелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Ñ ÑаблиÑами, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð¿ÑавилаINSERTилиUPDATE. Ð ÑÑом ÑлÑÑае подÑмайÑе о пÑименении изменÑемÑÑ Ð¿ÑедÑÑавлений.имÑ_ÑаблиÑÑÐÐ¼Ñ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹) ÑÑÑеÑÑвÑÑÑей ÑаблиÑÑ (или пÑедÑÑавлениÑ), к коÑоÑой пÑименÑеÑÑÑ ÑÑо пÑавило.
ÑÑловиеÐÑбое вÑÑажение ÑÑÐ»Ð¾Ð²Ð¸Ñ SQL (возвÑаÑаÑÑее
boolean). ÐÑо вÑÑажение не Ð¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° какие-либо ÑаблиÑÑ, кÑоме как наNEWиOLD, и не Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð°Ð³ÑегаÑнÑе ÑÑнкÑии.INSTEADINSTEADÑказÑваеÑ, ÑÑо заданнÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑполнÑÑÑÑÑ Ð²Ð¼ÐµÑÑо иÑÑ Ð¾Ð´Ð½Ð¾Ð¹ командÑ.ALSOALSOÑказÑваеÑ, ÑÑо заданнÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑполнÑÑÑÑÑ Ð² дополнение к иÑÑ Ð¾Ð´Ð½Ð¾Ð¹ команде.ÐÑли ни
ALSO, ниINSTEADне Ñказано, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑALSO.командаÐоманда или командÑ, ÑоÑÑавлÑÑÑие дейÑÑвие пÑавила. ÐдеÑÑ Ð´Ð¾Ð¿ÑÑÑÐ¸Ð¼Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ:
SELECT,INSERT,UPDATE,DELETEиNOTIFY.
РпаÑамеÑÑаÑ
ÑÑловие и команда можно иÑполÑзоваÑÑ Ð¸Ð¼ÐµÐ½Ð° ÑпеÑиалÑнÑÑ
ÑÐ°Ð±Ð»Ð¸Ñ NEW и OLD Ð´Ð»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº знаÑениÑм в ÑооÑвеÑÑÑвÑÑÑей ÑаблиÑе. NEW (новаÑ) пÑинимаеÑÑÑ Ð² пÑавилаÑ
ON INSERT и ON UPDATE и обознаÑÐ°ÐµÑ ÑÑÑÐ»ÐºÑ Ð½Ð° новÑÑ ÑÑÑокÑ, добавлÑемÑÑ Ð¸Ð»Ð¸ изменÑемÑÑ. OLD (ÑÑаÑаÑ) пÑинимаеÑÑÑ Ð² пÑавилаÑ
ON UPDATE и ON DELETE и обознаÑÐ°ÐµÑ ÑÑÑÐ»ÐºÑ Ð½Ð° ÑÑÑеÑÑвÑÑÑÑÑ ÑÑÑокÑ, изменÑемÑÑ Ð¸Ð»Ð¸ ÑдалÑемÑÑ.
ÐÑимеÑаниÑ
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¸Ð»Ð¸ измениÑÑ Ð¿Ñавила Ð´Ð»Ñ ÑаблиÑÑ, нÑжно бÑÑÑ ÐµÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑÑем.
РпÑавило Ð´Ð»Ñ INSERT, UPDATE или DELETE Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ добавиÑÑ Ð¿Ñедложение RETURNING, вÑдаÑÑее ÑÑолбÑÑ Ð¿ÑедÑÑавлениÑ. ÐÑо пÑедложение бÑÐ´ÐµÑ Ð³ÐµÐ½ÐµÑиÑоваÑÑ ÑезÑлÑÑаÑ, еÑли пÑавило ÑÑабоÑÐ°ÐµÑ Ð¿Ñи вÑполнении ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ INSERT RETURNING, UPDATE RETURNING или DELETE RETURNING. Ðогда пÑавило ÑÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ñи вÑполнении ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð±ÐµÐ· RETURNING, пÑедложение RETURNING ÑÑого пÑавила игноÑиÑÑеÑÑÑ. Ð ÑекÑÑей ÑеализаÑии ÑолÑко безÑÑловнÑе пÑавила INSTEAD могÑÑ ÑодеÑжаÑÑ RETURNING; более Ñого, допÑÑкаеÑÑÑ Ð¼Ð°ÐºÑимÑм одно пÑедложение RETURNING ÑÑеди вÑеÑ
пÑавил Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑого ÑобÑÑиÑ. (ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð¾Ð³ÑаниÑениÑ, ÑолÑко одно пÑедложение RETURNING Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²ÑбÑано Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑов.) ÐапÑоÑÑ Ñ RETURNING к Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ бÑдÑÑ Ð²ÑполнÑÑÑÑÑ, еÑли ни одно из опÑеделÑннÑÑ
Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ пÑавил не ÑодеÑÐ¶Ð¸Ñ Ð¿Ñедложение RETURNING.
ÐÑÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ð¾ ÑледиÑÑ Ð·Ð° Ñем, ÑÑÐ¾Ð±Ñ Ð¿Ñавила не заÑикливалиÑÑ. ÐапÑимеÑ, два ÑледÑÑÑиÑ
опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñавил бÑдÑÑ Ð¿ÑинÑÑÑ PostgreSQL, но пÑи попÑÑке вÑполниÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SELECT PostgreSQL ÑообÑÐ¸Ñ Ð¾Ð± оÑибке из-за ÑекÑÑÑивного ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¿Ñавила:
CREATE RULE "_RETURN" AS
ON SELECT TO t1
DO INSTEAD
SELECT * FROM t2;
CREATE RULE "_RETURN" AS
ON SELECT TO t2
DO INSTEAD
SELECT * FROM t1;
SELECT * FROM t1;РнаÑÑоÑÑее вÑемÑ, еÑли дейÑÑвие пÑавила ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ NOTIFY, ÑÑа команда бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð±ÐµÐ·ÑÑловно, Ñо еÑÑÑ, NOTIFY бÑÐ´ÐµÑ Ð²ÑдаваÑÑÑÑ, даже еÑли не найдÑÑÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
ÑÑÑок, к коÑоÑÑм Ð±Ñ Ð¿ÑименÑлоÑÑ Ð¿Ñавило. ÐапÑимеÑ, в ÑледÑÑÑем пÑимеÑе:
CREATE RULE notify_me AS ON UPDATE TO mytable DO ALSO NOTIFY mytable; UPDATE mytable SET name = 'foo' WHERE id = 42;
одно ÑобÑÑие NOTIFY бÑÐ´ÐµÑ Ð¾ÑпÑавлено пÑи вÑполнении ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ UPDATE, даже еÑли никакие ÑÑÑоки не ÑооÑвеÑÑÑвÑÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ id = 42. ÐÑо недоÑÑаÑок ÑекÑÑей ÑеализаÑии, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑпÑавлен в бÑдÑÑиÑ
веÑÑиÑÑ
.
СовмеÑÑимоÑÑÑ
ÐпеÑаÑÐ¾Ñ CREATE RULE ÑвлÑеÑÑÑ ÑзÑковÑм ÑаÑÑиÑением PostgreSQL, как и вÑÑ ÑиÑÑема пеÑезапиÑи запÑоÑов.