5.14. ÐÑÑлеживание завиÑимоÑÑей
Ðогда Ð²Ñ ÑоздаÑÑе ÑложнÑе ÑÑÑÑкÑÑÑÑ Ð±Ð°Ð· даннÑÑ , вклÑÑаÑÑие множеÑÑво ÑÐ°Ð±Ð»Ð¸Ñ Ñ Ð²Ð½ÐµÑними клÑÑами, пÑедÑÑавлениÑми, ÑÑиггеÑами, ÑÑнкÑиÑми и Ñ. п., Ð²Ñ Ð½ÐµÑвно ÑоздаÑÑе ÑеÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑей Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð±ÑекÑами. ÐапÑимеÑ, ÑаблиÑа Ñ Ð¾Ð³ÑаниÑением внеÑнего клÑÑа завиÑÐ¸Ñ Ð¾Ñ ÑаблиÑÑ, на коÑоÑÑÑ Ð¾Ð½Ð° ÑÑÑлаеÑÑÑ.
ÐÐ»Ñ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑелоÑÑноÑÑи ÑÑÑÑкÑÑÑÑ Ð²Ñей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , PostgreSQL не позволÑÐµÑ ÑдалÑÑÑ Ð¾Ð±ÑекÑÑ, Ð¾Ñ ÐºÐ¾ÑоÑÑÑ Ð·Ð°Ð²Ð¸ÑÑÑ Ð´ÑÑгие. ÐапÑимеÑ, попÑÑка ÑдалиÑÑ ÑаблиÑÑ products (Ð¼Ñ ÑаÑÑмаÑÑивали ÐµÑ Ð² ÐодÑазделе 5.4.5), Ð¾Ñ ÐºÐ¾ÑоÑой завиÑÐ¸Ñ ÑаблиÑа orders, пÑиведÑÑ Ðº оÑибке пÑимеÑно Ñакого ÑодеÑжаниÑ:
DROP TABLE products; ÐШÐÐÐÐ: ÑдалиÑÑ Ð¾Ð±ÑÐµÐºÑ "ÑаблиÑа products" нелÑзÑ, Ñак как Ð¾Ñ Ð½ÐµÐ³Ð¾ завиÑÑÑ Ð´ÑÑгие ÐÐÐÐ ÐÐÐÐСТÐ: огÑаниÑение orders_product_no_fkey в оÑноÑении "ÑаблиÑа orders" завиÑÐ¸Ñ Ð¾Ñ Ð¾Ð±ÑекÑа "ÑаблиÑа products" ÐÐÐСÐÐÐÐÐ: ÐÐ»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑимÑÑ Ð¾Ð±ÑекÑов иÑполÑзÑйÑе DROP ... CASCADE.
СообÑение об оÑибке даÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½ÑÑ Ð¿Ð¾Ð´ÑказкÑ: еÑли Ð²Ñ Ð½Ðµ Ñ Ð¾ÑиÑе занимаÑÑÑÑ Ð»Ð¸ÐºÐ²Ð¸Ð´Ð°Ñией завиÑимоÑÑей по оÑделÑноÑÑи, можно вÑполниÑÑ:
DROP TABLE products CASCADE;
и вÑе завиÑимÑе обÑекÑÑ, а Ñакже обÑекÑÑ, завиÑÑÑие Ð¾Ñ Ð½Ð¸Ñ
, бÑдÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ñ ÑекÑÑÑивно. Ð ÑÑом ÑлÑÑае ÑаблиÑа orders оÑÑанеÑÑÑ, а Ñдалено бÑÐ´ÐµÑ ÑолÑко ÐµÑ Ð¾Ð³ÑаниÑение внеÑнего клÑÑа. Удаление не ÑаÑпÑоÑÑÑаниÑÑÑ Ð½Ð° дÑÑгие обÑекÑÑ, Ñак как ни один обÑÐµÐºÑ Ð½Ðµ завиÑÐ¸Ñ Ð¾Ñ ÑÑого огÑаниÑениÑ. (ÐÑли Ð²Ñ Ñ
оÑиÑе пÑовеÑиÑÑ, ÑÑо пÑоизойдÑÑ Ð¿Ñи вÑполнении DROP ... CASCADE, запÑÑÑиÑе DROP без CASCADE и пÑоÑиÑайÑе ÐÐÐÐ ÐÐÐÐСТР(DETAIL).)
ÐоÑÑи вÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ DROP в PostgreSQL поддеÑживаÑÑ Ñказание CASCADE. ÐонеÑно, вид возможнÑÑ
завиÑимоÑÑей завиÑÐ¸Ñ Ð¾Ñ Ñипа обÑекÑа. ÐÑ Ñакже можеÑе напиÑаÑÑ RESTRICT вмеÑÑо CASCADE, ÑÑÐ¾Ð±Ñ Ð²ÐºÐ»ÑÑиÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ по ÑмолÑаниÑ, когда обÑÐµÐºÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑдалиÑÑ, ÑолÑко еÑли Ð¾Ñ Ð½ÐµÐ³Ð¾ не завиÑÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ дÑÑгие.
ÐÑимеÑание
СÑандаÑÑ SQL ÑÑебÑÐµÑ Ñвного ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ RESTRICT или CASCADE в команде DROP. Ðо ÑÑо ÑÑебование на Ñамом деле не вÑполнÑеÑÑÑ Ð½Ð¸ в одной СУÐÐ, пÑи ÑÑом одни ÑиÑÑÐµÐ¼Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваÑÑ RESTRICT, а дÑÑгие â CASCADE.
ÐÑли в команде DROP пеÑеÑиÑлÑÑÑÑÑ Ð½ÐµÑколÑко обÑекÑов, CASCADE ÑÑебÑеÑÑÑ ÑказÑваÑÑ, ÑолÑко когда еÑÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑи вне заданной гÑÑппÑ. ÐапÑимеÑ, в команде DROP TABLE tab1, tab2 пÑи налиÑии внеÑнего клÑÑа, ÑÑÑлаÑÑегоÑÑ Ð½Ð° tab1 из tab2, можно не ÑказÑваÑÑ CASCADE, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð° вÑполнилаÑÑ ÑÑпеÑно.
ÐÐ»Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑÐºÐ¸Ñ ÑÑнкÑий или пÑоÑедÑÑ, Ñело коÑоÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð¾ ÑÑÑоковой конÑÑанÑой, PostgreSQL оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°ÐµÑ Ð·Ð°Ð²Ð¸ÑимоÑÑи, ÑвÑзаннÑе Ñ Ð²Ð½ÐµÑне видимÑми ÑвойÑÑвами ÑÑнкÑии, Ñакими как ÑÐ¸Ð¿Ñ Ð°ÑгÑменÑов и ÑезÑлÑÑаÑа, но не завиÑимоÑÑи, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð²ÑÑÐ²Ð»ÐµÐ½Ñ ÑолÑко пÑи анализе Ñела ÑÑнкÑии. РкаÑеÑÑве пÑимеÑа ÑаÑÑмоÑÑиÑе ÑледÑÑÑий ÑÑенаÑий:
CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow',
'green', 'blue', 'purple');
CREATE TABLE my_colors (color rainbow, note text);
CREATE FUNCTION get_color_note (rainbow) RETURNS text AS
'SELECT note FROM my_colors WHERE color = $1'
LANGUAGE SQL; (ÐпиÑание ÑÑнкÑий ÑзÑка SQL можно найÑи в Разделе 38.5.) PostgreSQL бÑÐ´ÐµÑ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÑÑ, ÑÑо ÑÑнкÑÐ¸Ñ get_color_note завиÑÐ¸Ñ Ð¾Ñ Ñипа rainbow: пÑи Ñдалении Ñипа бÑÐ´ÐµÑ Ð¿ÑинÑдиÑелÑно Ñдалена ÑÑнкÑиÑ, Ñак как Ñип ÐµÑ Ð°ÑгÑменÑа оказÑваеÑÑÑ Ð½ÐµÐ¾Ð¿ÑеделÑннÑм. Ðо PostgreSQL не бÑÐ´ÐµÑ ÑÑиÑÑваÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑÑ get_color_note Ð¾Ñ ÑаблиÑÑ my_colors и не ÑÐ´Ð°Ð»Ð¸Ñ ÑÑнкÑÐ¸Ñ Ð¿Ñи Ñдалении ÑаблиÑÑ. Ðо Ñ ÑÑого подÑ
ода еÑÑÑ Ð½Ðµ ÑолÑко минÑÑ, но и плÑÑ. Ð ÑлÑÑае оÑÑÑÑÑÑÐ²Ð¸Ñ ÑаблиÑÑ ÑÑа ÑÑнкÑÐ¸Ñ Ð¾ÑÑанеÑÑÑ ÑабоÑей в некоÑоÑом ÑмÑÑле: Ñ
оÑÑ Ð¿Ñи попÑÑке вÑполниÑÑ ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка, но пÑи Ñоздании новой ÑаблиÑÑ Ñ Ñем же именем ÑÑнкÑÐ¸Ñ Ñнова бÑÐ´ÐµÑ ÑабоÑаÑÑ.
С дÑÑгой ÑÑоÑонÑ, пÑи опÑеделении ÑÑнкÑии или пÑоÑедÑÑÑ Ð² ÑÑиле ÑÑандаÑÑа SQL ÐµÑ Ñело ÑазбиÑаеÑÑÑ, и вÑе завиÑимоÑÑи, ÑаÑпознаваемÑе ÑинÑакÑиÑеÑким анализаÑоÑом, ÑÐ¾Ñ ÑанÑÑÑÑÑ. Таким обÑазом, еÑли запиÑаÑÑ Ð¿ÑиведÑннÑÑ Ð²ÑÑе ÑÑнкÑÐ¸Ñ ÐºÐ°Ðº
CREATE FUNCTION get_color_note (rainbow) RETURNS text BEGIN ATOMIC SELECT note FROM my_colors WHERE color = $1; END;
, Ñо бÑÐ´ÐµÑ Ð¸Ð·Ð²ÐµÑÑна завиÑимоÑÑÑ ÑÑнкÑии Ð¾Ñ ÑаблиÑÑ my_colors и команда DROP ÐµÑ Ð¾Ð±ÑабоÑаеÑ.