CREATE POLICY
CREATE POLICY â ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ Ð¿Ð¾Ð»Ð¸ÑÐ¸ÐºÑ Ð·Ð°ÑиÑÑ Ð½Ð° ÑÑовне ÑÑÑок Ð´Ð»Ñ ÑаблиÑÑ
СинÑакÑиÑ
CREATE POLICYимÑONимÑ_ÑаблиÑÑ[ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ] [ TO {имÑ_Ñоли| PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ] [ USING (вÑÑажение_USING) ] [ WITH CHECK (вÑÑажение_CHECK) ]
ÐпиÑание
Ðоманда CREATE POLICY опÑеделÑÐµÑ Ð´Ð»Ñ ÑаблиÑÑ Ð½Ð¾Ð²ÑÑ Ð¿Ð¾Ð»Ð¸ÑÐ¸ÐºÑ Ð·Ð°ÑиÑÑ Ð½Ð° ÑÑовне ÑÑÑок. ÐамеÑÑÑе, ÑÑо Ð´Ð»Ñ ÑаблиÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð²ÐºÐ»ÑÑена заÑиÑа на ÑÑовне ÑÑÑок (using ALTER TABLE ... ENABLE ROW LEVEL SECURITY), ÑÑÐ¾Ð±Ñ ÑозданнÑе полиÑики дейÑÑвовали.
ÐолиÑика даÑÑ ÑазÑеÑение на вÑбоÑкÑ, добавление, изменение или Ñдаление ÑÑÑок, ÑдовлеÑвоÑÑÑÑиÑ
ÑооÑвеÑÑÑвÑÑÑÐµÐ¼Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð¸Ñики. СÑÑеÑÑвÑÑÑие ÑÑÑоки ÑаблиÑÑ Ð¿ÑовеÑÑÑÑÑÑ Ð¿Ð¾ вÑÑажениÑ, ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð² USING, Ñогда как ÑÑÑоки, коÑоÑÑе могÑÑ Ð±ÑÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ INSERT или UPDATE пÑовеÑÑÑÑÑÑ Ð¿Ð¾ вÑÑажениÑ, ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ Ð² WITH CHECK. Ðогда вÑÑажение USING иÑÑинно Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑÑоки, ÑÑа ÑÑÑока видна полÑзоваÑелÑ, а еÑли ложно или вÑдаÑÑ NULL, ÑÑÑока не видна. Ðогда вÑÑажение WITH CHECK иÑÑинно Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑÑоки, ÑÑа ÑÑÑока добавлÑеÑÑÑ Ð¸Ð»Ð¸ изменÑеÑÑÑ, а еÑли ложно или вÑдаÑÑ NULL, пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¾Ñибка.
ÐÐ»Ñ Ð¾Ð¿ÐµÑаÑоÑов INSERT и UPDATE вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ WITH CHECK пÑименÑÑÑÑÑ Ð¿Ð¾Ñле ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ ÑÑиггеÑов BEFORE, но до Ñого, как бÑдÑÑ ÑобÑÑвенно модиÑиÑиÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð°Ð½Ð½Ñе. Таким обÑазом, ÑÑÐ¸Ð³Ð³ÐµÑ BEFORE ROW Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð´Ð°Ð½Ð½Ñе, подлежаÑие добавлениÑ, и повлиÑÑÑ Ð½Ð° ÑезÑлÑÑÐ°Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð»Ð¸Ñики заÑиÑÑ. ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ WITH CHECK обÑабаÑÑваÑÑÑÑ Ð´Ð¾ какиÑ
-либо дÑÑгиÑ
огÑаниÑений.
Ðмена полиÑик задаÑÑÑÑ Ð½Ð° ÑÑовне ÑаблиÑÑ. Таким обÑазом, одно Ð¸Ð¼Ñ Ð¿Ð¾Ð»Ð¸Ñики можно иÑполÑзоваÑÑ Ð² неÑколÑÐºÐ¸Ñ ÑазнÑÑ ÑаблиÑÐ°Ñ Ð¸ в каждой даÑÑ Ð¾ÑделÑное, Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑее ÑÑой ÑаблиÑе опÑеделение полиÑики.
ÐолиÑики могÑÑ Ð¿ÑименÑÑÑÑÑ Ð´Ð»Ñ Ð¾Ð¿ÑеделÑннÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ или Ð´Ð»Ñ Ð¾Ð¿ÑеделÑннÑÑ Ñолей. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑоздаваемÑе полиÑики пÑименÑÑÑÑÑ Ð´Ð»Ñ Ð²ÑÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ и Ñолей, еÑли Ñвно не задано дÑÑгое. Родной команде могÑÑ Ð¿ÑименÑÑÑÑÑ Ð½ÐµÑколÑко полиÑик; подÑобнее ÑаÑÑказÑваеÑÑÑ Ð½Ð¸Ð¶Ðµ. РТаблиÑе 1 показано, как к опÑеделÑннÑм командам пÑименÑÑÑÑÑ ÑазнÑе ÑÐ¸Ð¿Ñ Ð¿Ð¾Ð»Ð¸Ñик.
ÐÐ»Ñ Ð¿Ð¾Ð»Ð¸Ñик, коÑоÑÑе могÑÑ Ð¸Ð¼ÐµÑÑ Ð¸ вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ USING, и вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ WITH CHECK (ALL и UPDATE), в ÑлÑÑае оÑÑÑÑÑÑÐ²Ð¸Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ WITH CHECK вÑÑажение USING бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¸ Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи ÑÑÑок (обÑÑное назнаÑение USING) и Ð´Ð»Ñ Ð¾Ð¿ÑеделениÑ, какие ÑÑÑоки ÑазÑеÑено добавиÑÑ (назнаÑение WITH CHECK).
ÐÑли Ð´Ð»Ñ ÑаблиÑÑ Ð²ÐºÐ»ÑÑена заÑиÑа на ÑÑовне ÑÑÑок, но пÑименимÑе полиÑики оÑÑÑÑÑÑвÑÑÑ, пÑедполагаеÑÑÑ Ð¿Ð¾Ð»Ð¸Ñика «запÑеÑа по ÑмолÑаниÑ», Ñак ÑÑо никакие ÑÑÑоки нелÑÐ·Ñ Ð±ÑÐ´ÐµÑ ÑвидеÑÑ Ð¸Ð»Ð¸ измениÑÑ.
ÐаÑамеÑÑÑ
имÑÐÐ¼Ñ Ñоздаваемой полиÑики. Ðно должно оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼Ñн дÑÑÐ³Ð¸Ñ Ð¿Ð¾Ð»Ð¸Ñик Ð´Ð»Ñ ÑÑой ÑаблиÑÑ.
имÑ_ÑаблиÑÑÐÐ¼Ñ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹) ÑÑÑеÑÑвÑÑÑей ÑаблиÑÑ (или пÑедÑÑавлениÑ), к коÑоÑой пÑименÑеÑÑÑ ÑÑа полиÑика.
командаÐоманда, к коÑоÑой пÑименÑеÑÑÑ Ð¿Ð¾Ð»Ð¸Ñика. ÐопÑÑÑимÑе ваÑианÑÑ:
ALL,SELECT,INSERT,UPDATEиDELETE.ALL(вÑе) подÑазÑмеваеÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ. ÐÑобенноÑÑи Ð¸Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ñ Ð½Ð¸Ð¶Ðµ.имÑ_ÑÐ¾Ð»Ð¸Ð Ð¾Ð»Ñ (Ñоли), к коÑоÑой пÑименÑеÑÑÑ Ð¿Ð¾Ð»Ð¸Ñика. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ
PUBLIC, Ñо еÑÑÑ Ð¿Ð¾Ð»Ð¸Ñика пÑименÑеÑÑÑ ÐºÐ¾ вÑем ÑолÑм.вÑÑажение_USINGÐÑоизволÑное ÑÑловное вÑÑажение SQL (возвÑаÑаÑÑее
boolean). ÐÑо ÑÑловное вÑÑажение не Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð°Ð³ÑегаÑнÑе или оконнÑе ÑÑнкÑии. Ðогда вклÑÑена заÑиÑа на ÑÑовне ÑÑÑок, оно добавлÑеÑÑÑ Ð² запÑоÑÑ, обÑаÑаÑÑиеÑÑ Ðº данной ÑаблиÑе, и в Ð¸Ñ ÑезÑлÑÑаÑÐ°Ñ Ð¾ÐºÐ°Ð·ÑваÑÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ñми ÑолÑко Ñе ÑÑÑоки, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð¾Ð½Ð¾ вÑдаÑÑ true. ÐÑе ÑÑÑоки, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ ÑÑо вÑÑажение возвÑаÑÐ°ÐµÑ false или NULL, не бÑдÑÑ Ð²Ð¸Ð´Ð½Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ (в запÑоÑеSELECT), и не бÑдÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¸ÑикаÑии (запÑоÑамиUPDATEилиDELETE). Ð¢Ð°ÐºÐ°Ñ ÑÑÑока пÑоÑÑо пÑопÑÑкаеÑÑÑ, оÑибка пÑи ÑÑом не вÑдаÑÑÑÑ.вÑÑажение_CHECKÐÑоизволÑное ÑÑловное вÑÑажение SQL (возвÑаÑаÑÑее
boolean). ÐÑо ÑÑловное вÑÑажение не Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð°Ð³ÑегаÑнÑе или оконнÑе ÑÑнкÑии. Ðогда вклÑÑена заÑиÑа на ÑÑовне ÑÑÑок, оно пÑименÑеÑÑÑ Ð² запÑоÑаÑINSERTиUPDATEк ÑÑой ÑаблиÑе, Ñак ÑÑо в Ð½Ð¸Ñ Ð¿ÑинимаÑÑÑÑ ÑолÑко Ñе ÑÑÑоки, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð¾Ð½Ð¾ вÑдаÑÑ true. ÐÑли ÑÑо вÑÑажение вÑдаÑÑ false или NULL Ð´Ð»Ñ Ð»Ñбой из добавлÑемÑÑ Ð·Ð°Ð¿Ð¸Ñей или запиÑей, полÑÑаемÑÑ Ð¿Ñи изменении, вÑдаÑÑÑÑ Ð¾Ñибка. ÐамеÑÑÑе, ÑÑоогÑаниÑение_пÑовеÑкивÑÑиÑлÑеÑÑÑ Ð´Ð»Ñ Ð¿Ñедлагаемого нового ÑодеÑжимого ÑÑÑоки, а не Ð´Ð»Ñ ÑÑÑеÑÑвÑÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ .
ÐолиÑики по командам
ALLУказание
ALLÐ´Ð»Ñ Ð¿Ð¾Ð»Ð¸Ñики ознаÑаеÑ, ÑÑо она пÑименÑеÑÑÑ ÐºÐ¾ вÑем командам, вне завиÑимоÑÑи Ð¾Ñ Ñипа. ÐÑли ÑÑÑеÑÑвÑÐµÑ Ð¿Ð¾Ð»Ð¸ÑикаALLи дÑÑгие более деÑализиÑованнÑе полиÑики, Ñогда бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð¸ полиÑикаALL, и более деÑализиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ð¾Ð»Ð¸Ñика (или полиÑики). ÐÑоме Ñого, полиÑикиALLÑ Ð²ÑÑажениемUSINGбÑдÑÑ Ð¿ÑименÑÑÑÑÑ Ð¸ к ÑÑоÑоне вÑбоÑки, и к ÑÑоÑоне Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² запÑоÑе, еÑли опÑеделено ÑолÑко вÑÑажениеUSING.ÐапÑимеÑ, когда вÑполнÑеÑÑÑ
UPDATE, полиÑикаALLбÑÐ´ÐµÑ ÑилÑÑÑоваÑÑ Ð¸ ÑÑÑоки, коÑоÑÑе ÑÐ¼Ð¾Ð¶ÐµÑ Ð¿ÑоÑиÑаÑÑUPDATEÐ´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (пÑименÑÑ Ð²ÑÑажениеUSING), и оконÑаÑелÑнÑе изменÑннÑе ÑÑÑоки, пÑовеÑÑÑ, можно ли запиÑаÑÑ Ð¸Ñ Ð² ÑаблиÑÑ (пÑименÑÑ Ð²ÑÑажениеWITH CHECK, еÑли оно опÑеделено, илиUSINGв пÑоÑивном ÑлÑÑае). ÐÑли командаINSERTилиUPDATEпÑÑаеÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð² ÑаблиÑÑ ÑÑÑоки, не ÑдовлеÑвоÑÑÑÑие вÑÑажениÑWITH CHECKполиÑикиALL, вÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° бÑÐ´ÐµÑ Ð¿ÑеÑвана.SELECTУказание
SELECTÐ´Ð»Ñ Ð¿Ð¾Ð»Ð¸Ñики ознаÑаеÑ, ÑÑо она пÑименÑеÑÑÑ Ðº запÑоÑамSELECTи Ñогда, когда пÑи обÑаÑении к оÑноÑениÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑого опÑеделена полиÑика, задейÑÑвÑеÑÑÑ Ð¿ÑавоSELECT. Ð ÑезÑлÑÑаÑе запÑоÑSELECTвÑдаÑÑ ÑолÑко Ñе запиÑи из оÑноÑениÑ, коÑоÑÑе ÑдовлеÑвоÑÑÑ Ð¿Ð¾Ð»Ð¸ÑикеSELECT, и запÑоÑ, иÑполÑзÑÑÑий пÑавоSELECT, напÑимеÑ, запÑоÑUPDATE, ÑÐ²Ð¸Ð´Ð¸Ñ ÑолÑко запиÑи, ÑазÑеÑÑннÑе полиÑикойSELECT. ÐÐ»Ñ Ð¿Ð¾Ð»Ð¸ÑикиSELECTне Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð²ÑÑажениеWITH CHECK, Ñак как оно дейÑÑвÑÐµÑ ÑолÑко когда запиÑи ÑиÑаÑÑÑÑ Ð¸Ð· оÑноÑениÑ.INSERTУказание
INSERTÐ´Ð»Ñ Ð¿Ð¾Ð»Ð¸Ñики ознаÑаеÑ, ÑÑо она пÑименÑеÑÑÑ Ðº командамINSERT. ÐÑли вÑÑавлÑемÑе ÑÑÑоки не пÑÐ¾Ñ Ð¾Ð´ÑÑ Ð¿ÑовеÑÐºÑ Ð¿Ð¾Ð»Ð¸Ñики, вÑдаÑÑÑÑ Ð¾Ñибка наÑÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð¸Ñики и вÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°INSERTпÑеÑÑваеÑÑÑ. ÐÐ»Ñ Ð¿Ð¾Ð»Ð¸ÑикиINSERTне Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð²ÑÑажениеUSING, Ñак как она дейÑÑвÑÐµÑ ÑолÑко когда в оÑноÑение добавлÑÑÑÑÑ Ð·Ð°Ð¿Ð¸Ñи.ÐамеÑÑÑе, ÑÑо
INSERTÑ ÑказаниемON CONFLICT DO UPDATEпÑовеÑÑÐµÑ Ð²ÑÑажениÑWITH CHECKполиÑикINSERTÑолÑко Ð´Ð»Ñ ÑÑÑок, добавлÑемÑÑ Ð² оÑноÑение по пÑÑиINSERT.UPDATEÐÑÐ±Ð¾Ñ Ñипа
UPDATEÐ´Ð»Ñ Ð¿Ð¾Ð»Ð¸Ñики ознаÑаеÑ, ÑÑо она бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ Ðº командамUPDATE,SELECT FOR UPDATEиSELECT FOR SHARE, а Ñакже к дополниÑелÑнÑм пÑедложениÑмON CONFLICT DO UPDATEкомандINSERT. Так какUPDATEподÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ð¸Ð·Ð²Ð»ÐµÑение ÑÑÑеÑÑвÑÑÑей запиÑи и Ð·Ð°Ð¼ÐµÐ½Ñ ÐµÑ Ð½Ð¾Ð²Ð¾Ð¹ изменÑнной запиÑÑÑ, полиÑикиUPDATEпÑинимаÑÑ ÐºÐ°Ðº вÑÑажениеUSING, Ñак иWITH CHECK. ÐÑÑажениеUSINGопÑеделÑеÑ, какие запиÑи командаUPDATEÑÐ¼Ð¾Ð¶ÐµÑ ÑвидеÑÑ Ð´Ð»Ñ Ð¿Ð¾ÑледÑÑÑего изменениÑ, а вÑÑажениеWITH CHECKâ какие изменÑннÑе ÑÑÑоки ÑÐ¾Ñ ÑаниÑÑ Ð² оÑноÑении.ÐÑли в какой-либо ÑÑÑоке изменÑннÑе знаÑÐµÐ½Ð¸Ñ Ð½Ðµ бÑдÑÑ ÑдовлеÑвоÑÑÑÑ Ð²ÑÑажениÑ
WITH CHECK, пÑоизойдÑÑ Ð¾Ñибка и вÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° бÑÐ´ÐµÑ Ð¿ÑеÑвана. ÐÑли ÑказÑваеÑÑÑ ÑолÑко пÑедложениеUSING, его вÑÑажение бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð¸ в каÑеÑÑвеUSING, и в каÑеÑÑве вÑÑажениÑWITH CHECK.ÐбÑÑно команде
UPDATEÑакже нÑжно пÑоÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе из ÑÑолбÑов подлежаÑего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾ÑноÑÐµÐ½Ð¸Ñ (напÑимеÑ, в пÑедложенииWHEREилиRETURNINGлибо в вÑÑажении в пÑавой ÑаÑÑи пÑедложениÑSET). Ð ÑÑом ÑлÑÑае Ñакже ÑÑебÑеÑÑÑ Ð¸Ð¼ÐµÑÑ Ð¿ÑаваSELECTв изменÑемом оÑноÑении и в дополнение к полиÑикамUPDATEбÑдÑÑ Ð¿ÑименÑÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑие полиÑикиSELECTилиALL. Таким обÑазом, помимо Ñого, ÑÑо полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑазÑеÑаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ ÑÑÑок полиÑикиUPDATEилиALL, ÐµÐ¼Ñ Ñакже Ð´Ð¾Ð»Ð¶Ð½Ñ ÑазÑеÑаÑÑ Ð´Ð¾ÑÑÑп к изменÑемÑм ÑÑÑокам полиÑикиSELECTилиALL.Ðогда Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ
INSERTзадано вÑпомогаÑелÑное пÑедложениеON CONFLICT DO UPDATE, еÑли вÑбиÑаеÑÑÑ Ð¿ÑÑÑUPDATE, ÑÑÑока, подлежаÑÐ°Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, ÑнаÑала пÑовеÑÑеÑÑÑ Ð¿Ð¾ вÑÑажениÑмUSINGвÑÐµÑ Ð¿Ð¾Ð»Ð¸ÑикUPDATE, а заÑем изменÑÐ½Ð½Ð°Ñ ÑÑÑока еÑÑ Ñаз пÑовеÑÑеÑÑÑ Ð¿Ð¾ вÑÑажениÑмWITH CHECK. ÐамеÑÑÑе, однако, ÑÑо в оÑлиÑие Ð¾Ñ Ð¾ÑделÑной командÑUPDATE, еÑли ÑÑÑеÑÑвÑÑÑÐ°Ñ ÑÑÑока не ÑдовлеÑвоÑÑÐµÑ Ð²ÑÑажениÑмUSING, бÑÐ´ÐµÑ Ð²Ñдана оÑибка (пÑÑÑUPDATEникогда не пÑопÑÑкаеÑÑÑ Ð½ÐµÑвно).DELETEУказание
DELETEÐ´Ð»Ñ Ð¿Ð¾Ð»Ð¸Ñики ознаÑаеÑ, ÑÑо она пÑименÑеÑÑÑ Ðº командамDELETE. ÐомандаDELETEбÑÐ´ÐµÑ Ð²Ð¸Ð´ÐµÑÑ ÑолÑко Ñе ÑÑÑоки, коÑоÑÑе Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ ÑÑа полиÑика. ÐÑи ÑÑом ÑÑÑоки могÑÑ Ð±ÑÑÑ Ð²Ð¸Ð´Ð½Ñ ÑеÑезSELECT, но ÑдалиÑÑ Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð½ÐµÐ»ÑзÑ, еÑли они не ÑдовлеÑвоÑÑÑÑ Ð²ÑÑажениÑUSINGполиÑикиDELETE.РболÑÑинÑÑве ÑлÑÑаев команде
DELETEÑакже нÑжно пÑоÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе из ÑÑолбÑов в оÑноÑении, из коÑоÑого оÑÑÑеÑÑвлÑеÑÑÑ Ñдаление (напÑимеÑ, в пÑедложенииWHEREилиRETURNING). Ð ÑÐ°ÐºÐ¸Ñ ÑлÑÑаÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ Ñакже имеÑÑ Ð¿ÑавоSELECTÐ´Ð»Ñ ÑÑого оÑноÑениÑ, и в дополнение к полиÑикамDELETEбÑдÑÑ Ð¿ÑименÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑие полиÑикиSELECTилиALL. Таким обÑазом, полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ полÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÑдалÑемÑм ÑÑÑокам ÑеÑез полиÑикиSELECTилиALL, помимо Ñого ÑÑо Ñдаление ÑÑÐ¸Ñ ÑÑÑок ÐµÐ¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑазÑеÑиÑÑ Ð¿Ð¾Ð»Ð¸ÑикиDELETEилиALL.ÐÐ»Ñ Ð¿Ð¾Ð»Ð¸Ñики
DELETEне Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð²ÑÑажениеWITH CHECK, Ñак как она пÑименÑеÑÑÑ ÑолÑко Ñогда, когда запиÑи ÑдалÑÑÑÑÑ Ð¸Ð· оÑноÑениÑ, а в ÑÑом ÑлÑÑае новÑе ÑÑÑоки, подлежаÑие пÑовеÑке, оÑÑÑÑÑÑвÑÑÑ.
ТаблиÑа 1. ÐолиÑики, пÑименÑемÑе Ð´Ð»Ñ ÑазнÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´
| Ðоманда | ÐолиÑика SELECT/ALL | ÐолиÑика INSERT/ALL | ÐолиÑика UPDATE/ALL | ÐолиÑика DELETE/ALL | |
|---|---|---|---|---|---|
ÐÑÑажение USING | ÐÑÑажение WITH CHECK | ÐÑÑажение USING | ÐÑÑажение WITH CHECK | ÐÑÑажение USING | |
SELECT | СÑÑеÑÑвÑÑÑÐ°Ñ ÑÑÑока | â | â | â | â |
SELECT FOR UPDATE/SHARE | СÑÑеÑÑвÑÑÑÐ°Ñ ÑÑÑока | â | СÑÑеÑÑвÑÑÑÐ°Ñ ÑÑÑока | â | â |
INSERT | â | ÐÐ¾Ð²Ð°Ñ ÑÑÑока | â | â | â |
INSERT ... RETURNING | ÐÐ¾Ð²Ð°Ñ ÑÑÑока [a] | ÐÐ¾Ð²Ð°Ñ ÑÑÑока | â | â | â |
UPDATE | СÑÑеÑÑвÑÑÑие и новÑе ÑÑÑоки [a] | â | СÑÑеÑÑвÑÑÑÐ°Ñ ÑÑÑока | ÐÐ¾Ð²Ð°Ñ ÑÑÑока | â |
DELETE | СÑÑеÑÑвÑÑÑÐ°Ñ ÑÑÑока [a] | â | â | â | СÑÑеÑÑвÑÑÑÐ°Ñ ÑÑÑока |
ON CONFLICT DO UPDATE | СÑÑеÑÑвÑÑÑие и новÑе ÑÑÑоки | â | СÑÑеÑÑвÑÑÑÐ°Ñ ÑÑÑока | ÐÐ¾Ð²Ð°Ñ ÑÑÑока | â |
[a] ÐÑли Ð´Ð»Ñ ÑÑÑеÑÑвÑÑÑей или новой ÑÑÑоки ÑÑебÑеÑÑÑ Ð´Ð¾ÑÑÑп на ÑÑение (напÑимеÑ, пÑедложение | |||||
ÐÑименение неÑколÑÐºÐ¸Ñ Ð¿Ð¾Ð»Ð¸Ñик
Ðогда к одной команде пÑименÑÑÑÑÑ Ð½ÐµÑколÑко полиÑик Ð´Ð»Ñ ÑазлиÑнÑÑ
Ñипов команд (как напÑимеÑ, полиÑики SELECT и UPDATE пÑименÑÑÑÑÑ Ðº команде UPDATE), полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ ÑазÑеÑÐµÐ½Ð¸Ñ Ð²ÑеÑ
ÑÑиÑ
Ñипов (напÑимеÑ, ÑазÑеÑение Ð´Ð»Ñ Ð²ÑбоÑки ÑÑÑок из оÑноÑениÑ, а Ñакже ÑазÑеÑение на иÑ
изменение). Таким обÑазом, вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа полиÑики комбиниÑÑÑÑÑÑ Ñ Ð²ÑÑажениÑми Ð´Ð»Ñ Ð´ÑÑгого Ñипа опеÑаÑией Ð.
Ðогда к одной команде пÑименÑÑÑÑÑ Ð½ÐµÑколÑко полиÑик Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа команд, доÑÑÑп к оÑноÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° даÑÑ ÐºÐ°Ðº минимÑм одна полиÑика. Таким обÑазом вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð²ÑеÑ
полиÑик Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ñипа обÑединÑÑÑÑÑ Ð¾Ð¿ÐµÑаÑией ÐÐÐ. ÐÑли пÑименимÑе полиÑики оÑÑÑÑÑÑвÑÑÑ, доÑÑÑп запÑеÑаеÑÑÑ.
ÐамеÑÑÑе, ÑÑо пÑи обÑединении неÑколÑкиÑ
полиÑик, полиÑики ALL пÑименÑÑÑÑÑ ÐºÐ°Ðº полиÑики каждого пÑименимого в данном ÑлÑÑае Ñипа.
ÐапÑимеÑ, в команде UPDATE, ÑÑебÑÑÑей ÑазÑеÑений и Ð´Ð»Ñ SELECT, и Ð´Ð»Ñ UPDATE, в ÑлÑÑае ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÑколÑкиÑ
пÑименимÑÑ
полиÑик каждого Ñипа они бÑдÑÑ Ð¾Ð±ÑединÑÑÑÑÑ ÑледÑÑÑим обÑазом:
(вÑÑажениеfrom SELECT/ALL policy 1 ORвÑÑажениеfrom SELECT/ALL policy 2 OR ... ) AND (вÑÑажениеfrom UPDATE/ALL policy 1 ORвÑÑажениеfrom UPDATE/ALL policy 2 OR ... )
ÐамеÑаниÑ
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¸Ð»Ð¸ измениÑÑ Ð¿Ð¾Ð»Ð¸Ñики Ð´Ð»Ñ ÑаблиÑÑ, нÑжно бÑÑÑ ÐµÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑÑем.
ХоÑÑ Ð¿Ð¾Ð»Ð¸Ñики пÑименÑÑÑÑÑ Ðº Ñвно вÑполнÑемÑм запÑоÑам к ÑаблиÑам ÐÐ, они не пÑименÑÑÑÑÑ, когда ÑиÑÑема вÑполнÑÐµÑ Ð²Ð½ÑÑÑенние пÑовеÑки ÑÑÑлоÑной ÑелоÑÑноÑÑи или пÑовеÑÑÐµÑ Ð¾Ð³ÑаниÑениÑ. ÐÑо ознаÑаеÑ, ÑÑо ÑÑÑеÑÑвÑÑÑ ÐºÐ¾ÑвеннÑе пÑÑи пÑовеÑиÑÑ ÑÑÑеÑÑвование заданного знаÑениÑ. ÐапÑимеÑ, можно попÑÑаÑÑÑÑ Ð²ÑÑавиÑÑ Ð¿Ð¾Ð²ÑоÑÑÑÑееÑÑ Ð·Ð½Ð°Ñение в ÑÑолбеÑ, обÑазÑÑÑий пеÑвиÑнÑй клÑÑ Ð¸Ð»Ð¸ имеÑÑÑÑ Ð¾Ð³ÑаниÑение ÑникалÑноÑÑи. ÐÑли пÑи ÑÑом пÑоизойдÑÑ Ð¾Ñибка, полÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°ÐºÐ»ÑÑиÑÑ, ÑÑо ÑÑо знаÑение Ñже ÑÑÑеÑÑвÑеÑ. (Рданном ÑлÑÑае пÑедполагаеÑÑÑ, ÑÑо полиÑика ÑазÑеÑÐ°ÐµÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð²ÑÑавлÑÑÑ Ð·Ð°Ð¿Ð¸Ñи, коÑоÑÑе он Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ видеÑÑ.) ÐодобнÑй пÑиÑм Ñакже возможен, еÑли полÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑавлÑÑÑ Ð·Ð°Ð¿Ð¸Ñи в ÑаблиÑÑ, коÑоÑÐ°Ñ ÑÑÑлаеÑÑÑ Ð½Ð° дÑÑгÑÑ, инÑм обÑазом не видимÑÑ. СÑÑеÑÑвование знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ опÑеделиÑÑ, вÑÑавив его в подÑинÑннÑÑ ÑаблиÑÑ, пÑи ÑÑом ÑÑпеÑнÑй ÑезÑлÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑии бÑÐ´ÐµÑ Ð¿Ñизнаком Ñого, ÑÑо ÑÑо знаÑение еÑÑÑ Ð² главной ÑаблиÑе. ÐÑи изÑÑÐ½Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑÑÑÑаниÑÑ, либо ÑÑаÑелÑно ÑазÑабоÑав полиÑики, коÑоÑÑе вовÑе не позволÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑм вÑполнÑÑÑ Ð¾Ð¿ÐµÑаÑии добавлениÑ, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ ÑдалениÑ, по ÑезÑлÑÑаÑам коÑоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑзнаÑÑ Ð¾ знаÑениÑÑ Ð² ÑаблиÑÐ°Ñ , не видимÑÑ Ð¸Ð½Ñм обÑазом, либо иÑполÑзÑÑ Ð³ÐµÐ½ÐµÑиÑÑемÑе знаÑÐµÐ½Ð¸Ñ (напÑимеÑ, ÑÑÑÑогаÑнÑе клÑÑи).
ÐообÑе ÑиÑÑема бÑÐ´ÐµÑ Ð¿ÑименÑÑÑ ÑилÑÑÑÑ, ÑÑÑанавливаемÑе полиÑиками безопаÑноÑÑи, до ÑÑловий в запÑоÑаÑ
полÑзоваÑелÑ, ÑÑÐ¾Ð±Ñ Ð¿ÑедоÑвÑаÑиÑÑ Ð½ÐµÐ¶ÐµÐ»Ð°ÑелÑнÑÑ ÑÑеÑÐºÑ Ð·Ð°ÑиÑаемÑÑ
даннÑÑ
ÑеÑез полÑзоваÑелÑÑкие ÑÑнкÑии, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð½ÐµÐ´Ð¾Ð²ÐµÑеннÑми. Ðднако ÑÑнкÑии и опеÑаÑоÑÑ, помеÑеннÑе ÑиÑÑемой (или ÑиÑÑемнÑм админиÑÑÑаÑоÑом) как LEAKPROOF (геÑмеÑиÑнÑе) могÑÑ Ð²ÑÑиÑлÑÑÑÑÑ Ð´Ð¾ ÑÑловий полиÑики, Ñак как они ÑÑиÑаÑÑÑÑ Ð´Ð¾Ð²ÐµÑеннÑми.
Так как вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð¸Ñики добавлÑÑÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в запÑÐ¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ, они вÑполнÑÑÑÑÑ Ñ Ð¿Ñавами полÑзоваÑелÑ, запÑÑкаÑÑего иÑÑ Ð¾Ð´Ð½Ñй запÑоÑ. Таким обÑазом, полÑзоваÑели, на коÑоÑÑÑ ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ð¿Ð¾Ð»Ð¸Ñика, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ð¿Ñава Ð´Ð»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ ÐºÐ¾ вÑем ÑаблиÑам и ÑÑнкÑиÑм, задейÑÑвованнÑм в вÑÑажении, инаÑе им пÑоÑÑо бÑÐ´ÐµÑ Ð¾Ñказано в доÑÑÑпе пÑи попÑÑке обÑаÑÐµÐ½Ð¸Ñ Ðº Ñелевой ÑаблиÑе (еÑли Ð´Ð»Ñ Ð½ÐµÑ Ð²ÐºÐ»ÑÑена заÑиÑа на ÑÑовне ÑÑÑок). Ðднако ÑÑо не влиÑÐµÑ Ð½Ð° ÑабоÑÑ Ð¿ÑедÑÑавлений â как и Ñ Ð¾Ð±ÑÑнÑми запÑоÑами и пÑедÑÑавлениÑми, пÑовеÑки ÑазÑеÑений и полиÑики Ð´Ð»Ñ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°ÑÐ¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð²ÑполнÑÑÑÑÑ Ñ Ð¿Ñавами владелÑÑа пÑедÑÑавлениÑ, и пÑи ÑÑом бÑдÑÑ Ð´ÐµÐ¹ÑÑвоваÑÑ Ð¿Ð¾Ð»Ð¸Ñики, ÑаÑпÑоÑÑÑанÑÑÑиеÑÑ Ð½Ð° ÑÑого владелÑÑа.
ÐополниÑелÑное опиÑание и пÑакÑиÑеÑкие пÑимеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ найÑи в Разделе 5.7.
СовмеÑÑимоÑÑÑ
CREATE POLICY ÑвлÑеÑÑÑ ÑаÑÑиÑением Postgres Pro.