CREATE VIEW
CREATE VIEW â ÑоздаÑÑ Ð¿ÑедÑÑавление
СинÑакÑиÑ
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEWимÑ[ (имÑ_ÑÑолбÑа[, ...] ) ] [ WITH (имÑ_паÑамеÑÑа_пÑедÑÑавлениÑ[=знаÑение_паÑамеÑÑа_пÑедÑÑавлениÑ] [, ... ] ) ] ASзапÑоÑ[ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
ÐпиÑание
CREATE VIEW ÑоздаÑÑ Ð¿ÑедÑÑавление запÑоÑа. Создаваемое пÑедÑÑавление лиÑено ÑизиÑеÑкой маÑеÑиализаÑии, поÑÑÐ¾Ð¼Ñ ÑказаннÑй запÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ñи каждом обÑаÑении к пÑедÑÑавлениÑ.
Ðоманда CREATE OR REPLACE VIEW дейÑÑвÑÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñм обÑазом, но еÑли пÑедÑÑавление Ñ ÑÑим именем Ñже ÑÑÑеÑÑвÑеÑ, оно заменÑеÑÑÑ. ÐовÑй запÑÐ¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ вÑдаваÑÑ Ñе же ÑÑолбÑÑ, ÑÑо вÑдавал запÑоÑ, Ñанее опÑеделÑннÑй Ð´Ð»Ñ ÑÑого пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ (Ñо еÑÑÑ, ÑÑолбÑÑ Ñ Ñакими же именами Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ñе же ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
и ÑледоваÑÑ Ð² Ñом же поÑÑдке), но Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð½ÐµÑколÑко новÑÑ
ÑÑолбÑов в конÑе ÑпиÑка. ÐÑÑиÑлениÑ, в ÑезÑлÑÑаÑе коÑоÑÑÑ
ÑоÑмиÑÑÑÑÑÑ ÑÑолбÑÑ Ð¿ÑедÑÑавлениÑ, могÑÑ Ð±ÑÑÑ ÑовеÑÑенно дÑÑгими.
ÐÑли задано Ð¸Ð¼Ñ ÑÑ
ÐµÐ¼Ñ (напÑимеÑ, CREATE VIEW myschema.myview ...), пÑедÑÑавление ÑоздаÑÑÑÑ Ð² Ñказанной ÑÑ
еме, в пÑоÑивном ÑлÑÑае â в ÑекÑÑей. ÐÑеменнÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑÑеÑÑвÑÑÑ Ð² ÑпеÑиалÑной ÑÑ
еме, Ñак ÑÑо пÑи Ñоздании ÑакиÑ
пÑедÑÑавлений Ð¸Ð¼Ñ ÑÑ
ÐµÐ¼Ñ Ð·Ð°Ð´Ð°ÑÑ Ð½ÐµÐ»ÑзÑ. ÐÐ¼Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼Ñн дÑÑгиÑ
пÑедÑÑавлений, ÑаблиÑ, поÑледоваÑелÑноÑÑей, индекÑов или ÑÑоÑонниÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð² ÑÑой ÑÑ
еме.
ÐаÑамеÑÑÑ
TEMPORARYилиTEMPС Ñаким Ñказанием пÑедÑÑавление ÑоздаÑÑÑÑ ÐºÐ°Ðº вÑеменное. ÐÑеменнÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°Ð²ÑомаÑиÑеÑки ÑдалÑÑÑÑÑ Ð² конÑе ÑеанÑа. СÑÑеÑÑвÑÑÑее поÑÑоÑнное пÑедÑÑавление Ñ Ñем же именем не бÑÐ´ÐµÑ Ð²Ð¸Ð´Ð½Ð¾ в ÑекÑÑем ÑеанÑе, пока ÑÑÑеÑÑвÑÐµÑ Ð²Ñеменное, однако к Ð½ÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ обÑаÑиÑÑÑÑ, дополнив Ð¸Ð¼Ñ Ñказанием ÑÑ ÐµÐ¼Ñ.
ÐÑли в опÑеделении пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð´ÐµÐ¹ÑÑÐ²Ð¾Ð²Ð°Ð½Ñ Ð²ÑеменнÑе ÑаблиÑÑ, пÑедÑÑавление Ñак же ÑоздаÑÑÑÑ ÐºÐ°Ðº вÑеменное (вне завиÑимоÑÑи Ð¾Ñ Ð¿ÑиÑÑÑÑÑÐ²Ð¸Ñ Ñвного ÑказаниÑ
TEMPORARY).RECURSIVEСоздаÑÑ ÑекÑÑÑивное пÑедÑÑавление. СинÑакÑиÑ
CREATE RECURSIVE VIEW [
ÑÑ ÐµÐ¼Ð°. ]имÑ(имена_ÑÑолбÑов) AS SELECT...;ÑавнознаÑен
CREATE VIEW [
ÑÑ ÐµÐ¼Ð°. ]имÑAS WITH RECURSIVEимÑ(имена_ÑÑолбÑов) AS (SELECT...) SELECTимена_ÑÑолбÑовFROMимÑ;ÐÐ»Ñ ÑекÑÑÑивного пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑзаÑелÑно должен задаваÑÑÑÑ ÑпиÑок Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ ÑÑолбÑов.
имÑÐÐ¼Ñ Ñоздаваемого пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹).
имÑ_ÑÑолбÑаÐеобÑзаÑелÑнÑй ÑпиÑок имÑн, назнаÑаемÑÑ ÑÑолбÑам пÑедÑÑавлениÑ. ÐÑли оÑÑÑÑÑÑвÑеÑ, имена ÑÑолбÑов ÑоÑмиÑÑÑÑÑÑ Ð¸Ð· ÑезÑлÑÑаÑов запÑоÑа.
WITH (имÑ_паÑамеÑÑа_пÑедÑÑавлениÑ[=знаÑение_паÑамеÑÑа_пÑедÑÑавлениÑ] [, ... ] )Ð ÑÑом пÑедложении могÑÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ ÑледÑÑÑие необÑзаÑелÑнÑе паÑамеÑÑÑ Ð¿ÑедÑÑавлениÑ:
check_option(string)ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð·Ð½Ð°Ñение
local(локалÑно) илиcascaded(каÑкадно) и ÑавнознаÑен ÑказаниÑWITH [ CASCADED | LOCAL ] CHECK OPTION(Ñм. ниже). ÐзмениÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ñ ÑÑÑеÑÑвÑÑÑего пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ALTER VIEW нелÑзÑ.security_barrier(boolean)ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ, еÑли пÑедÑÑавление должно обеÑпеÑиваÑÑ Ð·Ð°ÑиÑÑ Ð½Ð° ÑÑовне ÑÑÑок. Ðа дополниÑелÑнÑми подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 37.5.
запÑоÑÐоманда SELECT или VALUES, коÑоÑÐ°Ñ Ð²ÑдаÑÑ ÑÑолбÑÑ Ð¸ ÑÑÑоки пÑедÑÑавлениÑ.
WITH [ CASCADED | LOCAL ] CHECK OPTIONÐÑо Ñказание ÑпÑавлÑÐµÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸ÐµÐ¼ авÑомаÑиÑеÑки изменÑемÑÑ Ð¿ÑедÑÑавлений. ÐÑли оно пÑиÑÑÑÑÑвÑеÑ, пÑи вÑполнении опеÑаÑий
INSERTиUPDATEÑ ÑÑим пÑедÑÑавлением бÑÐ´ÐµÑ Ð¿ÑовеÑÑÑÑÑÑ, ÑдовлеÑвоÑÑÑÑ Ð»Ð¸ новÑе ÑÑÑоки ÑÑловиÑ, опÑеделÑÑÑÐµÐ¼Ñ Ð¿ÑедÑÑавление (Ñо еÑÑÑ, пÑовеÑÑеÑÑÑ, бÑдÑÑ Ð»Ð¸ новÑе ÑÑÑоки Ð²Ð¸Ð´Ð½Ñ ÑеÑез ÑÑо пÑедÑÑавление). ÐÑли они не ÑдовлеÑвоÑÑÑÑ ÑÑловиÑ, опеÑаÑÐ¸Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð²Ñполнена. ÐÑли ÑказаниеCHECK OPTIONоÑÑÑÑÑÑвÑеÑ, командÑINSERTиUPDATEÑмогÑÑ ÑоздаваÑÑ Ð² ÑÑом пÑедÑÑавлении ÑÑÑоки, коÑоÑÑе не бÑдÑÑ Ð²Ð¸Ð´Ð½Ñ Ð² нÑм. ÐоддеÑживаÑÑÑÑ ÑледÑÑÑие ваÑианÑÑ Ð¿ÑовеÑки:LOCALÐовÑе ÑÑÑоки пÑовеÑÑÑÑÑÑ ÑолÑко по ÑÑловиÑм, опÑеделÑннÑм непоÑÑедÑÑвенно в Ñамом пÑедÑÑавлении. ÐÑбÑе ÑÑловиÑ, опÑеделÑннÑе в нижележаÑÐ¸Ñ Ð±Ð°Ð·Ð¾Ð²ÑÑ Ð¿ÑедÑÑавлениÑÑ , не пÑовеÑÑÑÑÑÑ (еÑли ÑолÑко в Ð½Ð¸Ñ Ð½ÐµÑ ÑказаниÑ
CHECK OPTION).CASCADEDÐовÑе ÑÑÑоки пÑовеÑÑÑÑÑÑ Ð¿Ð¾ ÑÑловиÑм данного пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ вÑÐµÑ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°ÑÐ¸Ñ Ð±Ð°Ð·Ð¾Ð²ÑÑ . ÐÑли Ñказано
CHECK OPTION, аLOCALиCASCADEDопÑÑено, подÑазÑмеваеÑÑÑ ÑказаниеCASCADED.
Указание
CHECK OPTIONнелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Ñ ÑекÑÑÑивнÑми пÑедÑÑавлениÑми.ÐамеÑÑÑе, ÑÑо
CHECK OPTIONподдеÑживаеÑÑÑ ÑолÑко Ð´Ð»Ñ Ð°Ð²ÑомаÑиÑеÑки изменÑемÑÑ Ð¿ÑедÑÑавлений, не имеÑÑÐ¸Ñ ÑÑиггеÑовINSTEAD OFи пÑавилINSTEAD. ÐÑли авÑомаÑиÑеÑки изменÑемое пÑедÑÑавление опÑеделено повеÑÑ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ ÑÑиггеÑамиINSTEAD OF, Ñо Ð´Ð»Ñ Ð¿ÑовеÑки огÑаниÑений авÑомаÑиÑеÑки изменÑемого пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ пÑимениÑÑ ÑказаниеLOCAL CHECK OPTION, Ñ Ð¾ÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ ÑÑиггеÑамиINSTEAD OFпÑи ÑÑом пÑовеÑÑÑÑÑÑ Ð½Ðµ бÑдÑÑ (каÑÐºÐ°Ð´Ð½Ð°Ñ Ð¿ÑовеÑка не бÑÐ´ÐµÑ ÑпÑÑкаÑÑÑÑ Ðº пÑедÑÑавлениÑ, модиÑиÑиÑÑÐµÐ¼Ð¾Ð¼Ñ ÑÑиггеÑом, и лÑбÑе паÑамеÑÑÑ Ð¿ÑовеÑки, опÑеделÑннÑе Ð´Ð»Ñ Ñакого пÑедÑÑавлениÑ, бÑдÑÑ Ð¿ÑоÑÑо игноÑиÑоваÑÑÑÑ). ÐÑли Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ лÑбого из его базовÑÑ Ð¾ÑноÑений опÑеделено пÑавилоINSTEAD, пÑиводÑÑее к пеÑезапиÑи командÑINSERTилиUPDATE, в пеÑезапиÑанном запÑоÑе вÑе паÑамеÑÑÑ Ð¿ÑовеÑки бÑдÑÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑÑÑ, в Ñом ÑиÑле пÑовеÑки авÑомаÑиÑеÑки изменÑемÑÑ Ð¿ÑедÑÑавлений, опÑеделÑннÑÑ Ð¿Ð¾Ð²ÐµÑÑ Ð¾ÑноÑений Ñ Ð¿ÑавиломINSTEAD.
ÐамеÑаниÑ
ÐÐ»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿ÑедÑÑавлений пÑименÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ DROP VIEW.
ÐÑдÑÑе аккÑÑаÑÐ½Ñ Ð² опÑеделении пÑедÑÑавлениÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¶ÐµÐ»Ð°ÐµÐ¼Ñе имена и ÑÐ¸Ð¿Ñ ÑÑолбÑов. ÐапÑимеÑ, ÑÐ°ÐºÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°:
CREATE VIEW vista AS SELECT 'Hello World';
ÑоздаÑÑ Ð¿ÑедÑÑавление Ñ Ð´Ð²ÑÐ¼Ñ Ð½ÐµÐ´Ð¾ÑÑаÑками: именем ÑÑолбÑа по ÑмолÑÐ°Ð½Ð¸Ñ Ð±ÑÐ´ÐµÑ ?column?, а Ñипом даннÑÑ
â unknown (неизвеÑÑнÑй). ÐÑли Ð²Ñ Ñ
оÑиÑе полÑÑиÑÑ Ð² пÑедÑÑавлении ÑÑÑоковÑÑ ÐºÐ¾Ð½ÑÑанÑÑ, лÑÑÑе ÑделаÑÑ Ñак:
CREATE VIEW vista AS SELECT text 'Hello World' AS hello;
ÐоÑÑÑп к ÑаблиÑам, задейÑÑвованнÑм в пÑедÑÑавлении, опÑеделÑеÑÑÑ Ð¿Ñавами владелÑÑа пÑедÑÑавлениÑ. РнекоÑоÑÑÑ ÑлÑÑаÑÑ ÑÑо позволÑÐµÑ Ð¾ÑганизоваÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑй, но огÑаниÑеннÑй доÑÑÑп к нижележаÑим ÑаблиÑам. Ðднако ÑÑÑиÑе, ÑÑо не вÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð·Ð°ÑиÑÑннÑми; за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 37.5. ФÑнкÑии, вÑзÑваемÑе в пÑедÑÑавлении, вÑполнÑÑÑÑÑ Ñак, как бÑдÑо они вÑзÑваÑÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно из запÑоÑа, обÑаÑаÑÑегоÑÑ Ðº пÑедÑÑавлениÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ Ð²Ñе пÑава, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе Ð´Ð»Ñ Ð²Ñзова вÑÐµÑ ÑÑнкÑий, задейÑÑвованнÑÑ Ð² пÑедÑÑавлении.
ÐÑи вÑполнении CREATE OR REPLACE VIEW Ð´Ð»Ñ ÑÑÑеÑÑвÑÑÑего пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼ÐµÐ½ÑеÑÑÑ ÑолÑко пÑавило SELECT, опÑеделÑÑÑее пÑедÑÑавление. ÐÑÑгие ÑвойÑÑва пÑедÑÑавлениÑ, вклÑÑÐ°Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑÑа, пÑава и пÑавила, кÑоме SELECT, оÑÑаÑÑÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñми. ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¾Ð¿Ñеделение пÑедÑÑавлениÑ, необÑ
одимо бÑÑÑ ÐµÐ³Ð¾ владелÑÑем (или Ñленом Ñоли-владелÑÑа).
ÐзменÑемÑе пÑедÑÑавлениÑ
ÐÑоÑÑÑе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑановÑÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑемÑми авÑомаÑиÑеÑки: ÑиÑÑема Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð²ÑполнÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ INSERT, UPDATE и DELETE Ñ Ñаким пÑедÑÑавлением Ñак же, как и Ñ Ð¾Ð±ÑÑной ÑаблиÑей. ÐÑедÑÑавление бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки изменÑемÑм, еÑли оно ÑдовлеÑвоÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно вÑем ÑледÑÑÑим ÑÑловиÑм:
СпиÑок
FROMв запÑоÑе, опÑеделÑÑÑем пÑедÑÑавлении, должен ÑодеÑжаÑÑ Ñовно один ÑлеменÑ, и ÑÑо должна бÑÑÑ ÑаблиÑа или дÑÑгое изменÑемое пÑедÑÑавление.ÐпÑеделение пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ должно ÑодеÑжаÑÑ Ð¿ÑедложениÑ
WITH,DISTINCT,GROUP BY,HAVING,LIMITиOFFSETна веÑÑ Ð½ÐµÐ¼ ÑÑовне запÑоÑа.ÐпÑеделение пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ должно ÑодеÑжаÑÑ Ð¾Ð¿ÐµÑаÑии Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвами (
UNION,INTERSECTиEXCEPT) на веÑÑ Ð½ÐµÐ¼ ÑÑовне запÑоÑа.СпиÑок вÑбоÑки в запÑоÑе не должен ÑодеÑжаÑÑ Ð°Ð³ÑегаÑнÑе и оконнÑе ÑÑнкÑии, а Ñакже ÑÑнкÑии, возвÑаÑаÑÑие множеÑÑва.
ÐвÑомаÑиÑеÑки обновлÑемое пÑедÑÑавление Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÐºÐ°Ðº изменÑемÑе, Ñак и не изменÑемÑе ÑÑолбÑÑ. СÑÐ¾Ð»Ð±ÐµÑ Ð±ÑÐ´ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÑемÑм, еÑли ÑÑо пÑоÑÑÐ°Ñ ÑÑÑлка на изменÑемÑй ÑÑÐ¾Ð»Ð±ÐµÑ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°Ñего базового оÑноÑениÑ; в пÑоÑивном ÑлÑÑае ÑÑÐ¾Ñ ÑÑÐ¾Ð»Ð±ÐµÑ Ð±ÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпен ÑолÑко Ð´Ð»Ñ ÑÑениÑ, и еÑли команда INSERT или UPDATE попÑÑаеÑÑÑ Ð·Ð°Ð¿Ð¸ÑаÑÑ Ð·Ð½Ð°Ñение в него, Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка.
ÐÑли пÑедÑÑавление авÑомаÑиÑеÑки изменÑемое, ÑиÑÑема бÑÐ´ÐµÑ Ð¿ÑеобÑазовÑваÑÑ Ð¾Ð±ÑаÑаÑÑиеÑÑ Ðº Ð½ÐµÐ¼Ñ Ð¾Ð¿ÐµÑаÑоÑÑ INSERT, UPDATE и DELETE в ÑооÑвеÑÑÑвÑÑÑие опеÑаÑоÑÑ, обÑаÑаÑÑиеÑÑ Ðº нижележаÑÐµÐ¼Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¼Ñ Ð¾ÑноÑениÑ. ÐÑи ÑÑом в полной меÑе поддеÑживаÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ INSERT Ñ Ð¿Ñедложением ON CONFLICT UPDATE.
ÐÑли авÑомаÑиÑеÑки изменÑемое пÑедÑÑавление ÑодеÑÐ¶Ð¸Ñ ÑÑловие WHERE, ÑÑо ÑÑловие огÑаниÑÐ¸Ð²Ð°ÐµÑ Ð½Ð°Ð±Ð¾Ñ ÑÑÑок, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ UPDATE и ÑÐ´Ð°Ð»ÐµÐ½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ DELETE в ÑÑом пÑедÑÑавлении. Ðднако UPDATE Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ ÑÑÑÐ¾ÐºÑ Ñак, ÑÑо она болÑÑе не бÑÐ´ÐµÑ ÑооÑвеÑÑÑвоваÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ WHERE и, как ÑледÑÑвие, болÑÑе не бÑÐ´ÐµÑ Ð²Ð¸Ð´Ð½Ð° ÑеÑез пÑедÑÑавление. Ðоманда INSERT подобнÑм обÑазом Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑавиÑÑ Ð² базовое оÑноÑение ÑÑÑоки, коÑоÑÑе не ÑдовлеÑвоÑÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ WHERE и поÑÑÐ¾Ð¼Ñ Ð½Ðµ бÑдÑÑ Ð²Ð¸Ð´Ð½Ñ ÑеÑез пÑедÑÑавление (ON CONFLICT UPDATE Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñм обÑазом воздейÑÑвоваÑÑ Ð½Ð° ÑÑÑеÑÑвÑÑÑÑÑ ÑÑÑокÑ, не видимÑÑ ÑеÑез пÑедÑÑавление). ЧÑÐ¾Ð±Ñ Ð·Ð°Ð¿ÑеÑиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼ INSERT и UPDATE ÑоздаваÑÑ Ñакие ÑÑÑоки, коÑоÑÑе не Ð²Ð¸Ð´Ð½Ñ ÑеÑез пÑедÑÑавление, можно воÑполÑзоваÑÑÑÑ Ñказанием CHECK OPTION.
ÐÑли авÑомаÑиÑеÑки изменÑемое пÑедÑÑавление Ð¸Ð¼ÐµÐµÑ ÑвойÑÑво security_barrier (баÑÑÐµÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи), Ñо вÑе ÑÑÐ»Ð¾Ð²Ð¸Ñ WHERE ÑÑого пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ (и вÑе ÑÑÐ»Ð¾Ð²Ð¸Ñ Ñ Ð³ÐµÑмеÑиÑнÑми опеÑаÑоÑами (LEAKPROOF)) бÑдÑÑ Ð²Ñегда вÑÑиÑлÑÑÑÑÑ Ð¿ÐµÑед ÑÑловиÑми, добавленнÑми полÑзоваÑелем пÑедÑÑавлениÑ. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 37.5. ÐамеÑÑÑе, ÑÑо по ÑÑой пÑиÑине ÑÑÑоки, коÑоÑÑе в конÑе конÑов не бÑли вÑÐ´Ð°Ð½Ñ (поÑÐ¾Ð¼Ñ ÑÑо не пÑоÑли пÑовеÑÐºÑ Ð² полÑзоваÑелÑÑком ÑÑловии WHERE), могÑÑ Ð²ÑÑ Ð¶Ðµ оÑÑаÑÑÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑованнÑми. ЧÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ, какие ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¿ÑименÑÑÑÑÑ Ð½Ð° ÑÑовне оÑноÑÐµÐ½Ð¸Ñ (и, как ÑледÑÑвие, избавлÑÑÑ ÑаÑÑÑ ÑÑÑок Ð¾Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовки), можно воÑполÑзоваÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ EXPLAIN.
Ðолее ÑложнÑе пÑедÑÑавлениÑ, не ÑдовлеÑвоÑÑÑÑие ÑÑим ÑÑловиÑм, по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ ÑолÑко Ð´Ð»Ñ ÑÑениÑ: ÑиÑÑема не Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð²ÑполниÑÑ Ð¾Ð¿ÐµÑаÑии добавлениÑ, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑÑÑок в Ñаком пÑедÑÑавлении. СоздаÑÑ ÑÑÑÐµÐºÑ Ð¸Ð·Ð¼ÐµÐ½Ñемого пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð½Ð¸Ñ
можно, опÑеделив ÑÑиггеÑÑ INSTEAD OF, коÑоÑÑе бÑдÑÑ Ð¿ÑеобÑазовÑваÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð½Ð° изменение даннÑÑ
в ÑооÑвеÑÑÑвÑÑÑие дейÑÑÐ²Ð¸Ñ Ñ Ð´ÑÑгими ÑаблиÑами. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº CREATE TRIGGER. Так же еÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑоздаваÑÑ Ð¿Ñавила (Ñм. CREATE RULE), но на пÑакÑике ÑÑиггеÑÑ Ð¿ÑоÑе Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¸ пÑименениÑ.
УÑÑиÑе, ÑÑо полÑзоваÑелÑ, вÑполнÑÑÑий опеÑаÑии добавлениÑ, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² пÑедÑÑавлении, должен имеÑÑ ÑооÑвеÑÑÑвÑÑÑие пÑава Ð´Ð»Ñ ÑÑого пÑедÑÑавлениÑ. ÐÑоме Ñого, Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ ÑопÑÑÑÑвÑÑÑие пÑава в нижележаÑÐ¸Ñ Ð±Ð°Ð·Ð¾Ð²ÑÑ Ð¾ÑноÑениÑÑ , Ñ Ð¾ÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ, ÑобÑÑвенно вÑполнÑÑÑий ÑÑи опеÑаÑии, Ð¼Ð¾Ð¶ÐµÑ ÑÑÐ¸Ñ Ð¿Ñав не имеÑÑ (Ñм. Раздел 37.5).
ÐÑимеÑÑ
Создание пÑедÑÑавлениÑ, ÑодеÑжаÑего вÑе комедийнÑе ÑилÑмÑ:
CREATE VIEW comedies AS
SELECT *
FROM films
WHERE kind = 'Comedy'; ÐÑа команда ÑоздаÑÑ Ð¿ÑедÑÑавление Ñо ÑÑолбÑами, коÑоÑÑе ÑодеÑжалиÑÑ Ð² ÑаблиÑе film в Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ. ХоÑÑ Ð¿Ñи Ñоздании пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ñло Ñказано *, ÑÑолбÑÑ, добавлÑемÑе в ÑаблиÑÑ Ð¿Ð¾Ð·Ð¶Ðµ, ÑаÑÑÑÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ бÑдÑÑ.
Создание пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ñказанием LOCAL CHECK OPTION:
CREATE VIEW universal_comedies AS
SELECT *
FROM comedies
WHERE classification = 'U'
WITH LOCAL CHECK OPTION; ÐÑа команда ÑоздаÑÑ Ð¿ÑедÑÑавление на базе пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ comedies, вÑдаÑÑее ÑолÑко комедии (kind = 'Comedy') ÑнивеÑÑалÑной возÑаÑÑной каÑегоÑии classification = 'U'. ÐÑÐ±Ð°Ñ Ð¿Ð¾Ð¿ÑÑка вÑполниÑÑ Ð² пÑедÑÑавлении INSERT или UPDATE Ñо ÑÑÑокой, не ÑдовлеÑвоÑÑÑÑей ÑÑÐ»Ð¾Ð²Ð¸Ñ classification = 'U', бÑÐ´ÐµÑ Ð¾ÑвеÑгнÑÑа, но огÑаниÑение по Ð¿Ð¾Ð»Ñ kind (Ñип ÑилÑма) пÑовеÑÑÑÑÑÑ Ð½Ðµ бÑдеÑ.
Создание пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ñказанием CASCADED CHECK OPTION:
CREATE VIEW pg_comedies AS
SELECT *
FROM comedies
WHERE classification = 'PG'
WITH CASCADED CHECK OPTION; ÐÑо пÑедÑÑавление бÑÐ´ÐµÑ Ð¿ÑовеÑÑÑÑ, ÑдовлеÑвоÑÑÑÑ Ð»Ð¸ новÑе ÑÑÑоки обоим ÑÑловиÑм: по ÑÑолбÑÑ kind и по ÑÑолбÑÑ classification.
Создание пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¸Ð·Ð¼ÐµÐ½ÑемÑми и неизменÑемÑми ÑÑолбÑами:
CREATE VIEW comedies AS
SELECT f.*,
country_code_to_name(f.country_code) AS country,
(SELECT avg(r.rating)
FROM user_ratings r
WHERE r.film_id = f.id) AS avg_rating
FROM films f
WHERE f.kind = 'Comedy'; ÐÑо пÑедÑÑавление бÑÐ´ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð¾Ð¿ÐµÑаÑии INSERT, UPDATE и DELETE. ÐзменÑемÑми бÑдÑÑ Ð²Ñе ÑÑолбÑÑ Ð¸Ð· ÑаблиÑÑ films, Ñогда как вÑÑиÑлÑемÑе ÑÑолбÑÑ country и avg_rating бÑдÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ ÑолÑко Ð´Ð»Ñ ÑÑениÑ.
Создание ÑекÑÑÑивного пÑедÑÑавлениÑ, ÑодеÑжаÑего ÑиÑла Ð¾Ñ 1 до 100:
CREATE RECURSIVE VIEW public.nums_1_100 (n) AS
VALUES (1)
UNION ALL
SELECT n+1 FROM nums_1_100 WHERE n < 100; ÐамеÑÑÑе, ÑÑо неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо Ð¸Ð¼Ñ ÑекÑÑÑивного пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¾ ÑÑ
емой в ÑÑой команде CREATE, внÑÑÑеннÑÑ ÑÑÑлка пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð° ÑÐµÐ±Ñ Ð¶Ðµ ÑÑ
емой не дополнÑеÑÑÑ. ÐÑо ÑвÑзано Ñ Ñем, ÑÑо Ð¸Ð¼Ñ Ð½ÐµÑвно Ñоздаваемого CTE не Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÑÑÑÑ ÑÑ
емой.
СовмеÑÑимоÑÑÑ
Ðоманда CREATE OR REPLACE VIEW â ÑзÑковое ÑаÑÑиÑение Postgres Pro. Так же ÑаÑÑиÑением ÑвлÑеÑÑÑ Ð¿Ñедложение WITH ( ... ) и конÑепÑÐ¸Ñ Ð²Ñеменного пÑедÑÑавлениÑ.