37.17. Упаковка ÑвÑзаннÑÑ Ð¾Ð±ÑекÑов в ÑаÑÑиÑение #
- 37.17.1. Ð¤Ð°Ð¹Ð»Ñ ÑаÑÑиÑений
- 37.17.2. ÐеÑемеÑаемоÑÑÑ ÑаÑÑиÑений
- 37.17.3. ÐонÑигÑÑаÑионнÑе ÑаблиÑÑ ÑаÑÑиÑений
- 37.17.4. Ðбновление ÑаÑÑиÑений
- 37.17.5. УÑÑановка ÑаÑÑиÑений ÑкÑипÑами обновлениÑ
- 37.17.6. ÐамеÑÐ°Ð½Ð¸Ñ Ð¾ безопаÑноÑÑи ÑаÑÑиÑений
- 37.17.7. ÐÑÐ¸Ð¼ÐµÑ ÑаÑÑиÑениÑ
- 37.17.2. ÐеÑемеÑаемоÑÑÑ ÑаÑÑиÑений
Ðолезное ÑаÑÑиÑение Postgres Pro обÑÑно вклÑÑÐ°ÐµÑ Ð½ÐµÑколÑко обÑекÑов SQL; напÑимеÑ, Ñ Ð¿Ð¾Ñвлением нового Ñипа даннÑÑ
могÑÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð½Ð¾Ð²Ñе ÑÑнкÑии, новÑе опеÑаÑоÑÑ Ð¸ новÑе клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов. ÐÑе ÑÑи обÑекÑÑ Ñдобно ÑобÑаÑÑ Ð² один пакеÑ, Ñ Ñем ÑÑÐ¾Ð±Ñ ÑпÑоÑÑиÑÑ ÑпÑавление базой даннÑÑ
. Ð Postgres Pro Ñакие пакеÑÑ Ð½Ð°Ð·ÑваÑÑÑÑ ÑаÑÑиÑениÑми. ЧÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ ÑаÑÑиÑение, вам понадобиÑÑÑ ÐºÐ°Ðº минимÑм Ñайл ÑкÑипÑа Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ SQL, ÑоздаÑÑими обÑекÑÑ ÑаÑÑиÑениÑ, и ÑпÑавлÑÑÑий Ñайл, в коÑоÑом опÑеделÑÑÑÑÑ Ð½ÐµÑколÑко базовÑÑ
ÑвойÑÑв Ñамого ÑаÑÑиÑениÑ. ÐÑли ÑаÑÑиÑение напиÑано на C, в него обÑÑно Ñакже вклÑÑаеÑÑÑ Ñайл ÑазделÑемой библиоÑеки, ÑодеÑжаÑий ÑкомпилиÑованнÑй код. ÐбеÑпеÑив налиÑие ÑÑиÑ
Ñайлов, загÑÑзиÑÑ Ð¸Ñ
в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
можно пÑоÑÑой командой CREATE EXTENSION.
ÐÑновное пÑеимÑÑеÑÑво ÑаÑÑиÑений по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¾Ð±ÑÑнÑм SQL-ÑкÑипÑом, загÑÑжаÑÑим множеÑÑво «ÑазÑозненнÑÑ
» обÑекÑов в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо Postgres Pro бÑÐ´ÐµÑ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÑÑ, ÑÑо обÑекÑÑ ÑаÑÑиÑÐµÐ½Ð¸Ñ ÑвÑÐ·Ð°Ð½Ñ Ð²Ð¼ÐµÑÑе. ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑдалиÑÑ Ð²Ñе обÑекÑÑ Ð¾Ð´Ð½Ð¾Ð¹ командой DROP EXTENSION (ÑазÑабаÑÑваÑÑ Ð¾ÑделÑнÑй ÑкÑÐ¸Ð¿Ñ Â«uninstall» не ÑÑебÑеÑÑÑ). ÐÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½ÐµÐµ Ñо, ÑÑо ÑÑилиÑа pg_dump знаеÑ, ÑÑо не нÑжно вÑгÑÑжаÑÑ Ð¾ÑделÑнÑе обÑекÑÑ, ÑоÑÑавлÑÑÑие ÑаÑÑиÑение â вмеÑÑо ÑÑого она пÑоÑÑо вклÑÑÐ¸Ñ Ð² аÑÑ
ивнÑй Ñайл ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE EXTENSION. ÐÑо каÑдиналÑно ÑпÑоÑÐ°ÐµÑ Ð¼Ð¸Ð³ÑаÑÐ¸Ñ Ð½Ð° новÑÑ Ð²ÐµÑÑÐ¸Ñ ÑаÑÑиÑениÑ, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð½Ð¾Ð²Ñе или дÑÑгие обÑекÑÑ Ð¿Ð¾ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¿ÑедÑдÑÑей веÑÑией. ÐамеÑÑÑе, однако, ÑÑо пÑи загÑÑзке Ñакого аÑÑ
ива в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
обÑзаÑелÑно налиÑие ÑкÑипÑа, ÑпÑавлÑÑÑего Ñайла и дÑÑгиÑ
Ñайлов ÑаÑÑиÑениÑ.
Postgres Pro не Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ ÑдалиÑÑ Ð¾ÑделÑнÑй обÑекÑ, ÑодеÑжаÑийÑÑ Ð² ÑаÑÑиÑении, кÑоме как пÑи Ñдалении вÑего ÑаÑÑиÑениÑ. Также имейÑе в видÑ, ÑÑо Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе измениÑÑ Ð¾Ð¿Ñеделение обÑекÑа, оÑноÑÑÑегоÑÑ Ðº ÑаÑÑиÑÐµÐ½Ð¸Ñ (напÑимеÑ, командой CREATE OR REPLACE FUNCTION Ð´Ð»Ñ ÑÑнкÑии), но изменÑнное опÑеделение не бÑÐ´ÐµÑ Ð²ÑгÑÑжено ÑÑилиÑой pg_dump. Такие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑÑно ÑазÑмнÑ, ÑолÑко еÑли они паÑаллелÑно оÑÑажаÑÑÑÑ Ð² Ñайле ÑкÑипÑа ÑаÑÑиÑениÑ. (ÐÐ»Ñ ÑаблиÑ, ÑодеÑжаÑиÑ
конÑигÑÑаÑионнÑе даннÑе, пÑедÑÑмоÑÑÐµÐ½Ñ ÑпеÑиалÑнÑе ÑÑедÑÑва; Ñм. ÐодÑаздел 37.17.3.) РпÑоизводÑÑвенной ÑÑеде обÑÑно лÑÑÑе ÑоздаваÑÑ ÑкÑÐ¸Ð¿Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑаÑÑиÑениÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð¾ÑноÑÑÑиеÑÑ Ðº ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑÑ.
СкÑÐ¸Ð¿Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ ÑÑÑанавливаÑÑ Ð¿Ñава доÑÑÑпа Ð´Ð»Ñ Ð¾Ð±ÑекÑов, ÑвлÑÑÑиÑ
ÑÑ ÑаÑÑÑÑ ÑаÑÑиÑениÑ, вÑполнÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ GRANT и REVOKE. ÐконÑаÑелÑнÑй Ð½Ð°Ð±Ð¾Ñ Ð¿Ñав Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ обÑекÑа (еÑли они заданÑ) бÑÐ´ÐµÑ ÑоÑ
ÑанÑн в ÑиÑÑемном каÑалоге pg_init_privs. ÐÑи иÑполÑзовании pg_dump в вÑгÑÑжаемÑй ÑкÑÐ¸Ð¿Ñ Ð±ÑÐ´ÐµÑ Ð²Ñведена команда CREATE EXTENSION Ñ Ð¿Ð¾ÑледÑÑÑими опеÑаÑоÑами GRANT и REVOKE, коÑоÑÑе ÑÑÑановÑÑ Ð¿Ñава, имевÑие меÑÑо в Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²ÑгÑÑзки.
Postgres Pro в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑкÑипÑÑ ÑаÑÑиÑений, вÑполнÑÑÑие опеÑаÑоÑÑ CREATE POLICY или SECURITY LABEL. ÐжидаеÑÑÑ, ÑÑо Ñакие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð±ÑдÑÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ð¾Ñле Ñого, как ÑаÑÑиÑение бÑÐ´ÐµÑ Ñоздано. ÐÑгÑÑÐ¶Ð°Ñ Ð´Ð°Ð½Ð½Ñе, pg_dump бÑÐ´ÐµÑ Ñакже вклÑÑаÑÑ Ð² вÑвод вÑе полиÑики RLS и меÑки безопаÑноÑÑи.
ÐеÑ
анизм ÑаÑÑиÑений Ñакже пÑедоÑÑавлÑÐµÑ ÑÑедÑÑва Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки дополниÑелÑнÑÑ
ÑкÑипÑов, пÑизваннÑÑ
изменÑÑÑ Ð¾Ð¿Ñеделение обÑекÑов SQL, ÑодеÑжаÑиÑ
ÑÑ Ð² ÑаÑÑиÑении. ÐапÑимеÑ, еÑли веÑÑÐ¸Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ 1.1, по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð²ÐµÑÑией 1.0, добавлÑÐµÑ Ð¾Ð´Ð½Ñ ÑÑнкÑÐ¸Ñ Ð¸ изменÑÐµÑ Ñело дÑÑгой ÑÑнкÑии, авÑÐ¾Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавиÑÑ ÑкÑÐ¸Ð¿Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ, коÑоÑÑй пÑоизведÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ ÑÑи два изменениÑ. ÐаÑем, воÑполÑзовавÑиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ ALTER EXTENSION UPDATE, можно бÑÐ´ÐµÑ Ð¿ÑимениÑÑ ÑÑи Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ оÑÑледиÑÑ, ÐºÐ°ÐºÐ°Ñ Ð²ÐµÑÑÐ¸Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ ÑакÑиÑеÑки ÑÑÑановлена в заданной базе даннÑÑ
.
Ð¢Ð¸Ð¿Ñ SQL-обÑекÑов, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ñленами ÑаÑÑиÑениÑ, пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² опиÑании ALTER EXTENSION. Ðе могÑÑ Ð±ÑÑÑ ÐµÐ³Ð¾ Ñленами, в ÑаÑÑноÑÑи, обÑекÑÑ ÑÑÐ¾Ð²Ð½Ñ ÐºÐ»Ð°ÑÑеÑа, Ñакие как Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, Ñоли и ÑаблиÑнÑе пÑоÑÑÑанÑÑва, Ñак как ÑаÑÑиÑение ÑÑÑеÑÑвÑÐµÑ ÑолÑко в ÑамкаÑ
одной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. (СкÑипÑÑ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð½Ðµ запÑеÑаеÑÑÑ ÑоздаваÑÑ Ñакие обÑекÑÑ, но еÑли он ÑÐ´ÐµÐ»Ð°ÐµÑ ÑÑо, они не бÑдÑÑ ÑÑиÑаÑÑÑÑ ÑаÑÑÑÑ ÑаÑÑиÑениÑ.) Также замеÑÑÑе, ÑÑо неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо ÑаблиÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñленом ÑаÑÑиÑениÑ, ÐµÑ Ð¿Ð¾Ð´ÑинÑннÑе обÑекÑÑ, Ñакие как индекÑÑ, непоÑÑедÑÑвеннÑми Ñленами ÑаÑÑиÑÐµÐ½Ð¸Ñ ÑÑиÑаÑÑÑÑ Ð½Ðµ бÑдÑÑ. ÐÑÑ Ð¾Ð´Ð¸Ð½ важнÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ â ÑÑ
ÐµÐ¼Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÑинадлежаÑÑ ÑаÑÑиÑениÑм, но не наобоÑоÑ; поÑÑÐ¾Ð¼Ñ ÑаÑÑиÑение Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐ¿Ð¾Ð»Ð½Ð¾Ðµ Ð¸Ð¼Ñ Ð¸ не ÑÑÑеÑÑвÑÐµÑ Â«Ð²Ð½ÑÑÑи» какой-либо ÑÑ
емÑ. Ðднако обÑекÑÑ-ÑÐ»ÐµÐ½Ñ ÑаÑÑиÑениÑ, бÑдÑÑ Ð¾ÑноÑиÑÑÑÑ Ðº ÑÑ
емам, еÑли ÑÑо ÑмеÑÑно Ð´Ð»Ñ Ð¸Ñ
Ñипов. Сами ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¸Ð¼ÐµÑÑ, а могÑÑ Ð½Ðµ имеÑÑ Ð¾ÑÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð»Ð°Ð´ÐµÑÑ ÑÑ
емами, к коÑоÑÑм оÑноÑÑÑÑÑ Ð¾Ð±ÑекÑÑ-ÑÐ»ÐµÐ½Ñ ÑаÑÑиÑениÑ.
ÐÑли ÑкÑÐ¸Ð¿Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ ÑоздаÑÑ ÐºÐ°ÐºÐ¸Ðµ-либо вÑеменнÑе обÑекÑÑ (напÑимеÑ, вÑеменнÑе ÑаблиÑÑ), ÑÑи обÑекÑÑ Ð±ÑдÑÑ ÑÑиÑаÑÑÑÑ Ñленами ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð´Ð¾ конÑа ÑекÑÑего ÑеанÑа, но ÑдалÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки в конÑе ÑеанÑа, как и Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑеменнÑе обÑекÑÑ. ÐÑо ÑвлÑеÑÑÑ Ð¸ÑклÑÑением из пÑавила, запÑеÑаÑÑего Ñдаление обÑекÑов-Ñленов ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð±ÐµÐ· ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð²Ñего ÑаÑÑиÑениÑ.
37.17.1. Ð¤Ð°Ð¹Ð»Ñ ÑаÑÑиÑений #
Ðоманда CREATE EXTENSION задейÑÑвÑÐµÑ ÑпÑавлÑÑÑий Ñайл ÑаÑÑиÑениÑ, коÑоÑÑй должен назÑваÑÑÑÑ Ð¿Ð¾ имени ÑаÑÑиÑениÑ, Ñ ÑÑÑÑикÑом .control, и должен бÑÑÑ Ð¿Ð¾Ð¼ÐµÑÑн в каÑалог ÑеÑвеÑа SHAREDIR/extension. Ðолжен бÑÑÑ Ñакже еÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ñм один SQL-ÑкÑипÑ, Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼, ÑооÑвеÑÑÑвÑÑÑим ÑÐ°Ð±Ð»Ð¾Ð½Ñ (напÑимеÑ, ÑаÑÑиÑение--веÑÑиÑ.sqlfoo--1.0.sql Ð´Ð»Ñ Ð²ÐµÑÑии 1.0 ÑаÑÑиÑÐµÐ½Ð¸Ñ foo). Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑкÑипÑ(Ñ) Ñакже помеÑаеÑÑÑ Ð² каÑалог SHAREDIR/extension; но в ÑпÑавлÑÑÑем Ñайле можно задаÑÑ Ð¸ дÑÑгой каÑалог.
ФоÑÐ¼Ð°Ñ ÑпÑавлÑÑÑего Ñайла ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð½Ðµ оÑлиÑаеÑÑÑ Ð¾Ñ ÑоÑмаÑа postgresql.conf, а именно пÑедÑÑавлÑÐµÑ Ñобой ÑпиÑок пÑиÑваиваний имÑ_паÑамеÑÑа = знаÑение, по Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð² ÑÑÑоке. РнÑм Ñакже допÑÑкаÑÑÑÑ Ð¿ÑÑÑÑе ÑÑÑоки и комменÑаÑии, наÑинаÑÑиеÑÑ Ñ #. ÐÑе знаÑениÑ, оÑлиÑнÑе Ð¾Ñ ÐµÐ´Ð¸Ð½ÑÑвенного Ñлова или ÑиÑла, в нÑм Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°ÐºÐ»ÑÑаÑÑÑÑ Ð² кавÑÑки.
Ð ÑпÑавлÑÑÑем Ñайле могÑÑ ÑÑÑанавливаÑÑÑÑ ÑледÑÑÑие паÑамеÑÑÑ:
directory(string) #ÐаÑалог, ÑодеÑжаÑий SQL-ÑкÑипÑ(Ñ) ÑаÑÑиÑениÑ. ÐÑли ÑолÑко не задан абÑолÑÑнÑй пÑÑÑ, ÑÑо Ð¸Ð¼Ñ ÑаÑÑмаÑÑиваеÑÑÑ Ð¾ÑноÑиÑелÑно каÑалога ÑеÑвеÑа
SHAREDIR. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ Ñказаниеdirectory = 'extension'.default_version(string) #ÐеÑÑÐ¸Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ (Ñа, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ ÑÑÑановлена, еÑли в
CREATE EXTENSIONне бÑÐ´ÐµÑ Ñказана Ð½Ð¸ÐºÐ°ÐºÐ°Ñ Ð²ÐµÑÑиÑ). ХоÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ опÑÑÑиÑÑ, ÑÑо пÑиведÑÑ Ðº оÑибке вCREATE EXTENSIONбез Ñвного ÑказаниÑVERSION, ÑÑо вÑÑд ли бÑÐ´ÐµÑ Ð¶ÐµÐ»Ð°ÐµÐ¼Ñм поведением.comment(string) #ÐомменÑаÑий (пÑоизволÑÐ½Ð°Ñ ÑÑÑока) к ÑаÑÑиÑениÑ. ÐомменÑаÑий пÑименÑеÑÑÑ Ð¿Ñи изнаÑалÑном Ñоздании ÑаÑÑиÑениÑ, но не пÑи обновлениÑÑ ÑаÑÑиÑÐµÐ½Ð¸Ñ (Ñак как пÑи ÑÑом мог Ð±Ñ Ð·Ð°Ð¼ÐµÐ½ÑÑÑÑÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½ÑаÑий, заданнÑй полÑзоваÑелем). ÐомменÑаÑий ÑаÑÑиÑÐµÐ½Ð¸Ñ Ñакже можно задаÑÑ Ð¿Ð¾ÑÑедÑÑвом ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ COMMENT в Ñайле ÑкÑипÑа.
encoding(string) #ÐодиÑовка Ñимволов, иÑполÑзÑÐµÐ¼Ð°Ñ Ð² ÑÐ°Ð¹Ð»Ð°Ñ ÑкÑипÑов. ÐÑ ÑледÑÐµÑ ÑказаÑÑ, еÑли ÑÑи ÑÐ°Ð¹Ð»Ñ ÑодеÑÐ¶Ð°Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð½Ðµ из набоÑа ASCII. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿ÑедполагаеÑÑÑ, ÑÑо ÑÑи ÑÐ°Ð¹Ð»Ñ ÑодеÑÐ¶Ð°Ñ ÑекÑÑ Ð² кодиÑовке Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
module_pathname(string) #ÐнаÑение ÑÑого паÑамеÑÑа бÑÐ´ÐµÑ Ð¿Ð¾Ð´ÑÑавлÑÑÑÑÑ Ð²Ð¼ÐµÑÑо каждого Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ
MODULE_PATHNAMEв ÑкÑипÑÐ°Ñ . ÐÑли ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð½Ðµ задан, подÑÑановка не пÑоизводиÑÑÑ. ÐбÑÑно Ð´Ð»Ñ ÑÑого паÑамеÑÑа ÑÑÑанавливаеÑÑÑ Ð·Ð½Ð°Ñение$libdir/, а заÑем в командаÑимÑ_ÑазделÑемой_библиоÑекиCREATE FUNCTIONÐ´Ð»Ñ ÑÑнкÑий на ÑзÑке C ÑказÑваеÑÑÑMODULE_PATHNAME, ÑÑÐ¾Ð±Ñ Ð² ÑкÑипÑÐ°Ñ Ð½Ðµ пÑÐ¸Ñ Ð¾Ð´Ð¸Ð»Ð¾ÑÑ Ð¶ÑÑÑко задаваÑÑ Ð¸Ð¼Ñ ÑазделÑемой библиоÑеки.requires(string) #СпиÑок имÑн ÑаÑÑиÑений, Ð¾Ñ ÐºÐ¾ÑоÑÑÑ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð´Ð°Ð½Ð½Ð¾Ðµ, напÑимеÑ,
requires = 'foo, bar'. ÐÑи ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ñже ÑÑÑановленÑ, пÑежде Ñем можно бÑÐ´ÐµÑ ÑÑÑановиÑÑ Ð´Ð°Ð½Ð½Ð¾Ðµ.no_relocate(string) #СпиÑок имÑн ÑаÑÑиÑений, Ð¾Ñ ÐºÐ¾ÑоÑÑÑ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð´Ð°Ð½Ð½Ð¾Ðµ ÑаÑÑиÑение и коÑоÑÑм ÑледÑÐµÑ Ð·Ð°Ð¿ÑеÑиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ ÑÐ²Ð¾Ð¸Ñ ÑÑ ÐµÐ¼ командой
ALTER EXTENSION ... SET SCHEMA. ÐÑо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾, еÑли ÑкÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑаÑÑиÑÐµÐ½Ð¸Ñ ÑÑÑлаеÑÑÑ Ð½Ð° Ð¸Ð¼Ñ ÑÑебÑемой ÑÑ ÐµÐ¼Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ (иÑполÑзÑÑ ÑинÑакÑиÑ@extschema:) Ñаким обÑазом, ÑÑо не Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑлеживаÑÑ Ð¿ÐµÑеименованиÑ.имÑ@superuser(boolean) #ÐÑли ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение
true(по ÑмолÑаниÑ), ÑолÑко ÑÑпеÑполÑзоваÑели ÑмогÑÑ ÑоздаÑÑ ÑÑо ÑаÑÑиÑение или обновиÑÑ ÐµÐ³Ð¾ до новой веÑÑии. (Ðднако обÑаÑиÑе внимание на ÑвойÑÑвоtrusted, опиÑанное ниже). ÐÑли он Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñениеfalse, Ð´Ð»Ñ ÑÑого бÑÐ´ÐµÑ Ð´Ð¾ÑÑаÑоÑно пÑав, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ в ÑÑÑановоÑном ÑкÑипÑе или ÑкÑипÑе обновлениÑ. ÐбÑÑно знаÑениеtrueдолжно ÑÑÑанавливаÑÑÑÑ, еÑли Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ°ÐºÐ¾Ð¹-либо из команд в ÑÑÐ¸Ñ ÑкÑипÑÐ°Ñ ÑÑебÑÑÑÑÑ Ð¿Ñава ÑÑпеÑполÑзоваÑелÑ. Такие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² лÑбом ÑлÑÑае не бÑдÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ ÑÑпеÑно, но лÑÑÑе ÑообÑиÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¾Ð± оÑибке заÑанее.trusted(boolean) #ÐÑли ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение
true(по ÑмолÑÐ°Ð½Ð¸Ñ ÑÑо не Ñак), Ñо ÑаÑÑиÑение, Ð´Ð»Ñ ÐºÐ¾ÑоÑого ÑвойÑÑвоsuperuserÑавноtrue, ÑмогÑÑ ÑÑÑанавливаÑÑ Ð½Ðµ ÑолÑко ÑÑпеÑполÑзоваÑели. Рименно, ÑÑÑановиÑÑ ÐµÐ³Ð¾ ÑмогÑÑ Ð»ÑбÑе полÑзоваÑели, имеÑÑие пÑавоCREATEв ÑекÑÑей базе даннÑÑ . Ðогда полÑзоваÑелÑ, вÑполнÑÑÑийCREATE EXTENSION, не ÑвлÑеÑÑÑ ÑÑпеÑполÑзоваÑелем, но ÐµÐ¼Ñ ÑазÑеÑена ÑÑÑановка ÑÑого ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑедÑÑвом ÑÑого паÑамеÑÑа, ÑкÑÐ¸Ð¿Ñ ÑÑÑановки или Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑÑкаеÑÑÑ Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ наÑалÑного ÑÑпеÑполÑзоваÑелÑ, а не Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ вÑзÑваÑÑего полÑзоваÑелÑ. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð½Ðµ игÑÐ°ÐµÑ Ñоли, еÑли ÑвойÑÑвоsuperuserÑавноfalse. ÐообÑе говоÑÑ, ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð½Ðµ ÑледÑÐµÑ ÑÑÑанавливаÑÑ Ð´Ð»Ñ ÑаÑÑиÑений, коÑоÑÑе могÑÑ Ð¾ÑкÑÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи, инаÑе доÑÑÑпнÑе ÑолÑко ÑÑпеÑполÑзоваÑелÑм, напÑимеÑ, пÑедоÑÑавиÑÑ Ð´Ð¾ÑÑÑп к Ñайловой ÑиÑÑеме. ÐÑоме Ñого, еÑли ÑаÑÑиÑение помеÑаеÑÑÑ ÐºÐ°Ðº довеÑенное, напиÑание безопаÑнÑÑ ÑкÑипÑов ÑÑÑановки и Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ ÑÑебÑÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÑÑилий; Ñм. ÐодÑаздел 37.17.6.relocatable(boolean) #РаÑÑиÑение ÑвлÑеÑÑÑ Ð¿ÐµÑемеÑаемÑм, еÑли оÑноÑÑÑиеÑÑ Ðº Ð½ÐµÐ¼Ñ Ð¾Ð±ÑекÑÑ Ð¿Ð¾Ñле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ пеÑемеÑÑиÑÑ Ð² дÑÑгÑÑ ÑÑ ÐµÐ¼Ñ. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ
false, Ñо еÑÑÑ ÑаÑÑиÑение не ÑÑиÑаеÑÑÑ Ð¿ÐµÑемеÑаемÑм. ÐодÑобнее об ÑÑом ÑаÑÑказÑваеÑÑÑ Ð² ÐодÑазделе 37.17.2.schema(string) #ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ ÑолÑко Ð´Ð»Ñ Ð½ÐµÐ¿ÐµÑемеÑаемÑÑ ÑаÑÑиÑений. ÐÑли он задан, ÑаÑÑиÑение можно бÑÐ´ÐµÑ Ð·Ð°Ð³ÑÑзиÑÑ ÑолÑко в ÑказаннÑÑ ÑÑ ÐµÐ¼Ñ Ð¸ не в какÑÑ Ð´ÑÑгÑÑ. ÐодÑобнее об ÑÑом ÑаÑÑказÑваеÑÑÑ Ð½Ð¸Ð¶Ðµ. ÐаÑамеÑÑ
schemaÑÑиÑÑваеÑÑÑ ÑолÑко пÑи изнаÑалÑном Ñоздании ÑаÑÑиÑениÑ, но не пÑи его обновлении. ÐодÑобнее об ÑÑом ÑаÑÑказÑваеÑÑÑ Ð² ÐодÑазделе 37.17.2.
Ðомимо главного ÑпÑавлÑÑÑего Ñайла , ÑаÑÑиÑение Ð¼Ð¾Ð¶ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑпÑавлÑÑÑие ÑÐ°Ð¹Ð»Ñ Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ вида ÑаÑÑиÑение.control. ÐÑли они пÑиÑÑÑÑÑвÑÑÑ, они Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½Ð°Ñ
одиÑÑÑÑ Ð² Ñом же каÑалоге, ÑÑо и оÑновной ÑкÑипÑ. ÐополниÑелÑнÑе ÑпÑавлÑÑÑие ÑÐ°Ð¹Ð»Ñ Ð¸Ð¼ÐµÑÑ ÑÐ¾Ñ Ð¶Ðµ ÑоÑмаÑ, ÑÑо и оÑновной. ÐÑбÑе паÑамеÑÑÑ, заданнÑе в дополниÑелÑном ÑпÑавлÑÑÑем Ñайле, пеÑеопÑеделÑÑÑ Ð¿Ð°ÑамеÑÑÑ Ð¾Ñновного Ñайла, когда вÑполнÑеÑÑÑ ÑÑÑановка ÑÑой веÑÑии ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ обновление до неÑ. Ðднако паÑамеÑÑÑ ÑаÑÑиÑение--веÑÑиÑ.controldirectory и default_version в дополниÑелÑнÑÑ
ÑпÑавлÑÑÑиÑ
ÑайлаÑ
задаÑÑ Ð½ÐµÐ»ÑзÑ.
SQL-ÑкÑипÑÑ ÑаÑÑиÑений могÑÑ ÑодеÑжаÑÑ Ð»ÑбÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL, за иÑклÑÑением команд ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑанзакÑиÑми (BEGIN, COMMIT и Ñ. д.) и команд, коÑоÑÑе не могÑÑ Ð²ÑполнÑÑÑÑÑ Ð²Ð½ÑÑÑи блока ÑÑанзакÑии (напÑимеÑ, VACUUM). ÐÑо обÑÑÑнÑеÑÑÑ Ñем, ÑÑо ÑÑи ÑкÑипÑÑ Ð½ÐµÑвно вÑполнÑÑÑÑÑ Ð² блоке ÑÑанзакÑии.
SQL-ÑкÑипÑÑ ÑаÑÑиÑений Ñакже могÑÑ ÑодеÑжаÑÑ ÑÑÑоки, наÑинаÑÑиеÑÑ Ñ \echo, и они бÑдÑÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑÑÑ (воÑпÑинимаÑÑÑÑ ÐºÐ°Ðº комменÑаÑии) меÑ
анизмом ÑаÑÑиÑений. ÐÑо ÑаÑÑо иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð²Ñвода оÑибки в ÑлÑÑае, еÑли ÑÑÐ¾Ñ ÑкÑÐ¸Ð¿Ñ Ð²ÑполнÑеÑÑÑ Ð² psql, а не загÑÑжаеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ CREATE EXTENSION (Ñм. пÑÐ¸Ð¼ÐµÑ ÑкÑипÑа в ÐодÑазделе 37.17.7). ÐÑли Ñакое вÑполнение не пÑедоÑвÑаÑиÑÑ, полÑзоваÑели могÑÑ ÑлÑÑайно загÑÑзиÑÑ ÑодеÑжимое ÑаÑÑиÑÐµÐ½Ð¸Ñ ÐºÐ°Ðº «ÑазÑозненнÑе» обÑекÑÑ, а не как ÑобÑÑвенно ÑаÑÑиÑение, и полÑÑиÑÑ ÑоÑÑоÑние, коÑоÑое доволÑно Ñложно иÑпÑавиÑÑ.
ÐÑли ÑкÑÐ¸Ð¿Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ ÑодеÑÐ¶Ð¸Ñ ÑÑÑÐ¾ÐºÑ @extowner@, она бÑÐ´ÐµÑ Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ð° именем (еÑли ÑÑебÑеÑÑÑ, заклÑÑÑннÑм в кавÑÑки) полÑзоваÑелÑ, вÑполнÑÑÑего ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE EXTENSION или ALTER EXTENSION. ÐбÑÑно ÑÑо полезно Ð´Ð»Ñ Ð´Ð¾Ð²ÐµÑеннÑÑ
ÑаÑÑиÑений, в коÑоÑÑÑ
владелÑÑем внÑÑÑенниÑ
обÑекÑов назнаÑаеÑÑÑ Ð½Ðµ наÑалÑнÑй ÑÑпеÑполÑзоваÑелÑ, а вÑзÑваÑÑий полÑзоваÑелÑ. (Ðднако ÑÑо ÑледÑÐµÑ Ð´ÐµÐ»Ð°ÑÑ Ñ Ð¾ÑÑоÑожноÑÑÑÑ. ÐапÑимеÑ, еÑли назнаÑиÑÑ Ð¾Ð±ÑÑного полÑзоваÑÐµÐ»Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑÑем ÑÑнкÑии на ÑзÑке C, ÑÑо Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ ÐµÐ¼Ñ Ð¿Ð¾Ð²ÑÑиÑÑ Ñвои пÑава.)
Тогда как ÑÐ°Ð¹Ð»Ñ ÑкÑипÑов могÑÑ ÑодеÑжаÑÑ Ð»ÑбÑе ÑимволÑ, допÑÑÑимÑе в Ñказанной кодиÑовке, ÑпÑавлÑÑÑие ÑÐ°Ð¹Ð»Ñ Ð¼Ð¾Ð³ÑÑ ÑодеÑжаÑÑ ÑолÑко ASCII-ÑимволÑ, Ñак как ÑказаÑÑ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²ÐºÑ ÑÑиÑ
Ñайлов в Postgres Pro Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ возможноÑÑи. Ðа пÑакÑике ÑÑо пÑедÑÑавлÑÐµÑ Ð¿ÑоблемÑ, ÑолÑко еÑли Ð²Ñ Ñ
оÑиÑе иÑполÑзоваÑÑ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð½Ðµ из набоÑа ASCII в комменÑаÑии ÑаÑÑиÑениÑ. Ð ÑакиÑ
ÑлÑÑаÑÑ
ÑекомендÑеÑÑÑ Ð½Ðµ иÑполÑзоваÑÑ Ð¿Ð°ÑамеÑÑ comment в ÑпÑавлÑÑÑем Ñайле, а вмеÑÑо ÑÑого задаÑÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½ÑаÑий командой COMMENT ON EXTENSION в Ñайле ÑкÑипÑа.
37.17.2. ÐеÑемеÑаемоÑÑÑ ÑаÑÑиÑений #
У полÑзоваÑелей ÑаÑÑо Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¶ÐµÐ»Ð°Ð½Ð¸Ðµ загÑÑзиÑÑ Ð¾Ð±ÑекÑÑ, ÑодеÑжаÑиеÑÑ Ð² ÑаÑÑиÑении, в ÑÑ ÐµÐ¼Ñ, оÑлиÑнÑÑ Ð¾Ñ Ñой, ÑÑо вÑбÑал авÑÐ¾Ñ ÑаÑÑиÑениÑ. ÐаÑколÑко ÑÑо поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑаÑÑиÑение, опиÑÑваеÑÑÑ Ð¾Ð´Ð½Ð¸Ð¼ из ÑÑÑÑ ÑÑовней:
ÐолноÑÑÑÑ Ð¿ÐµÑемеÑаемое ÑаÑÑиÑение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑемеÑено в дÑÑгÑÑ ÑÑ ÐµÐ¼Ñ Ð² лÑбое вÑемÑ, даже поÑле Ñого, как оно загÑÑжено в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÑо оÑÑÑеÑÑвлÑеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹
ALTER EXTENSION SET SCHEMA, коÑоÑÐ°Ñ Ð°Ð²ÑомаÑиÑеÑки пеÑеименовÑÐ²Ð°ÐµÑ Ð²Ñе обÑекÑÑ-ÑÐ»ÐµÐ½Ñ ÑаÑÑиÑениÑ, пеÑеноÑÑ Ð¸Ñ Ð² новÑÑ ÑÑ ÐµÐ¼Ñ. ÐбÑÑно ÑÑо возможно, ÑолÑко еÑли в ÑаÑÑиÑении Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð²Ð½ÑÑÑÐµÐ½Ð½Ð¸Ñ Ð¿Ñедположений о Ñом, в какой ÑÑ ÐµÐ¼Ðµ Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð²Ñе его обÑекÑÑ. ÐÑоме Ñого, вÑе обÑекÑÑ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ð² одной иÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑ ÐµÐ¼Ðµ (за иÑклÑÑением обÑекÑов, не пÑинадлежаÑÐ¸Ñ ÑÑ ÐµÐ¼Ð°Ð¼, как, напÑимеÑ, пÑоÑедÑÑнÑе ÑзÑки). ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð¼ÐµÑиÑÑ ÑаÑÑиÑение как полноÑÑÑÑ Ð¿ÐµÑемеÑаемое, ÑÑÑановиÑеrelocatable = trueв его ÑпÑавлÑÑÑем Ñайле.РаÑÑиÑение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑемеÑаемÑм в Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÑÑановки, но не поÑле. ÐбÑÑно ÑÑо Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÑо, когда ÑкÑипÑÑ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ Ñвно ÑÑÑлаÑÑÑÑ Ð½Ð° ÑелевÑÑ ÑÑ ÐµÐ¼Ñ, напÑимеÑ, ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ ÑвойÑÑва
search_pathÐ´Ð»Ñ ÑÑнкÑий SQL. ÐÐ»Ñ Ñакого ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð½Ñжно задаÑÑrelocatable = falseв его ÑпÑавлÑÑÑем Ñайле и обÑаÑаÑÑÑÑ Ðº Ñелевой ÑÑ ÐµÐ¼Ðµ в ÑкÑипÑе по пÑевдоимени@extschema@. ÐÑе Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÑÑого пÑевдоимени бÑдÑÑ Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ вÑбÑанной Ñелевой ÑÑ ÐµÐ¼Ñ (пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи заклÑÑÑннÑм в двойнÑе кавÑÑки) пеÑед вÑполнением ÑкÑипÑа. ÐолÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑаÑÑ ÑелевÑÑ ÑÑ ÐµÐ¼Ñ Ð² ÑказанииSCHEMAкомандÑCREATE EXTENSION.ÐÑли ÑаÑÑиÑение вовÑе не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿ÐµÑемеÑение, ÑÑÑановиÑе в его ÑпÑавлÑÑÑем Ñайле
relocatable = false, и Ñакже задайÑе в паÑамеÑÑеschemaÐ¸Ð¼Ñ Ð¿Ñедполагаемой Ñелевой ÑÑ ÐµÐ¼Ñ. ÐÑо пÑедоÑвÑаÑÐ¸Ñ Ð¸ÑполÑзование ÑказаниÑSCHEMAкомандÑCREATE EXTENSION, еÑли ÑолÑко оно задаÑÑ Ð½Ðµ Ñо же имÑ, ÑÑо опÑеделено в ÑпÑавлÑÑÑем Ñайле. ÐÑÐ¾Ñ Ð²ÑÐ±Ð¾Ñ Ð¾Ð±ÑÑно Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼, еÑли в ÑаÑÑиÑении делаÑÑÑÑ Ð²Ð½ÑÑÑенние пÑÐµÐ´Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð± имени ÑÑ ÐµÐ¼Ñ ÑаÑÑиÑениÑ, коÑоÑое нелÑÐ·Ñ ÑвеÑÑи к иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñевдоимени@extschema@. ÐÐµÑ Ð°Ð½Ð¸Ð·Ð¼ подÑÑановки@extschema@бÑÐ´ÐµÑ ÑабоÑаÑÑ Ð¸ в ÑÑом ÑлÑÑае, Ñ Ð¾ÑÑ Ð¿Ð¾Ð»Ñза Ð¾Ñ Ð½ÐµÐ³Ð¾ бÑÐ´ÐµÑ Ð¾Ð³ÑаниÑенной, Ñак как Ð¸Ð¼Ñ ÑÑ ÐµÐ¼Ñ Ð¾Ð¿ÑеделÑеÑÑÑ ÑпÑавлÑÑÑим Ñайлом.
РлÑбом ÑлÑÑае пÑи вÑполнении Ñайла ÑкÑипÑа паÑамеÑÑ search_path изнаÑалÑно бÑÐ´ÐµÑ ÑказÑваÑÑ Ð½Ð° ÑелевÑÑ ÑÑ
емÑ; Ñо еÑÑÑ, CREATE EXTENSION Ð´ÐµÐ»Ð°ÐµÑ Ñо же, ÑÑо и:
SET LOCAL search_path TO @extschema@, pg_temp;
ÐÑо позволÑÐµÑ Ð½Ð°Ð¿ÑавиÑÑ Ð¾Ð±ÑекÑÑ, ÑоздаваемÑе ÑкÑипÑом, в ÑелевÑÑ ÑÑ
емÑ. СкÑÐ¸Ð¿Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ search_path, еÑли пожелаеÑ, но обÑÑно ÑÑо нежелаÑелÑно. ÐаÑамеÑÑ search_path воÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¿ÑедÑдÑÑее знаÑение по завеÑÑении CREATE EXTENSION.
Ð¦ÐµÐ»ÐµÐ²Ð°Ñ ÑÑ
ема опÑеделÑеÑÑÑ Ð¿Ð°ÑамеÑÑом schema (еÑли он задан) в ÑпÑавлÑÑÑем Ñайле, либо Ñказанием SCHEMA ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE EXTENSION (еÑли оно пÑиÑÑÑÑÑвÑеÑ), а в пÑоÑивном ÑлÑÑае вÑбиÑаеÑÑÑ ÑекÑÑÐ°Ñ ÑÑ
ема Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов по ÑмолÑÐ°Ð½Ð¸Ñ (пеÑÐ²Ð°Ñ ÑÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð² паÑамеÑÑе search_path вÑзÑваÑÑего). Ðогда иÑполÑзÑеÑÑÑ Ð¿Ð°ÑамеÑÑ ÑпÑавлÑÑÑего Ñайла schema, ÑÐµÐ»ÐµÐ²Ð°Ñ ÑÑ
ема бÑÐ´ÐµÑ Ñоздана, еÑли она еÑÑ Ð½Ðµ ÑÑÑеÑÑвÑеÑ, но в двÑÑ
дÑÑгиÑ
ÑлÑÑаÑÑ
она должна Ñже ÑÑÑеÑÑвоваÑÑ.
ÐÑли в паÑамеÑÑе requires в ÑпÑавлÑÑÑем Ñайле ÑаÑÑиÑÐµÐ½Ð¸Ñ ÑÐºÐ°Ð·Ð°Ð½Ñ ÐºÐ°ÐºÐ¸Ðµ-либо ÑаÑÑиÑениÑ, необÑ
одимÑе Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾, иÑ
ÑелевÑе ÑÑ
ÐµÐ¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑÑÑ Ðº наÑалÑÐ½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ search_path поÑле Ñелевой ÑÑ
ÐµÐ¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑаÑÑиÑениÑ. ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð¸Ñ
обÑекÑÑ Ð²Ð¸Ð´Ð½Ñ Ð´Ð»Ñ ÑкÑипÑа нового ÑаÑÑиÑениÑ.
Ð ÑелÑÑ
безопаÑноÑÑи ÑÑ
ема pg_temp вÑегда авÑомаÑиÑеÑки добавлÑеÑÑÑ Ð² ÐºÐ¾Ð½ÐµÑ search_path.
ХоÑÑ Ð½ÐµÐ¿ÐµÑемеÑаемое ÑаÑÑиÑение Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¾Ð±ÑекÑÑ, ÑаÑпÑеделÑемÑе по неÑколÑким ÑÑ
емам, обÑÑно желаÑелÑно помеÑÑиÑÑ Ð²Ñе обÑекÑÑ, пÑедназнаÑеннÑе Ð´Ð»Ñ Ð²Ð½ÐµÑнего иÑполÑзованиÑ, в Ð¾Ð´Ð½Ñ ÑÑ
емÑ, назнаÑеннÑÑ Ñелевой ÑÑ
емой ÑаÑÑиÑениÑ. Такой поÑÑдок бÑÐ´ÐµÑ Ñ
оÑоÑо ÑоглаÑовÑваÑÑÑÑ Ñо знаÑением search_path по ÑмолÑÐ°Ð½Ð¸Ñ Ð² пÑоÑеÑÑе ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑимÑÑ
ÑаÑÑиÑений.
ÐÑли ÑаÑÑиÑение ÑÑÑлаеÑÑÑ Ð½Ð° обÑекÑÑ, пÑинадлежаÑие дÑÑÐ³Ð¾Ð¼Ñ ÑаÑÑиÑениÑ, ÑекомендÑеÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑÑ ÑÑи ÑÑÑлки именами ÑÑ
ем. ÐÐ»Ñ ÑÑого напиÑиÑе @extschema: в Ñайле ÑкÑипÑа ÑаÑÑиÑениÑ, где имÑ@Ð¸Ð¼Ñ â ÑÑо Ð¸Ð¼Ñ Ð´ÑÑгого ÑаÑÑиÑÐµÐ½Ð¸Ñ (коÑоÑое должно бÑÑÑ Ð² ÑпиÑке requires ÑÑого ÑаÑÑиÑениÑ). ÐÑа ÑÑÑока бÑÐ´ÐµÑ Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ð° именем (пÑи необÑ
одимоÑÑи заклÑÑÑннÑм в двойнÑе кавÑÑки) Ñелевой ÑÑ
ÐµÐ¼Ñ ÑÑого ÑаÑÑиÑениÑ. ХоÑÑ ÑÐ°ÐºÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð¸Ð·Ð±Ð°Ð²Ð»ÑÐµÑ Ð¾Ñ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи делаÑÑ Ð·Ð°Ð¿ÑогÑаммиÑованнÑе пÑÐµÐ´Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð± именаÑ
ÑÑ
ем в Ñайле ÑкÑипÑа ÑаÑÑиÑениÑ, пÑи ÐµÑ Ð¸ÑполÑзовании Ð¸Ð¼Ñ ÑÑ
ÐµÐ¼Ñ Ð´ÑÑгого ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑÑаиваÑÑÑÑ Ð² ÑÑÑановленнÑе обÑекÑÑ. (ÐбÑÑно ÑÑо пÑоиÑÑ
одиÑ, когда @extschema: иÑполÑзÑеÑÑÑ Ð²Ð½ÑÑÑи ÑÑÑокового лиÑеÑала, Ñакого как Ñело ÑÑнкÑии или паÑамеÑÑ Ð¸Ð¼Ñ@search_path. РдÑÑгиÑ
ÑлÑÑаÑÑ
ÑÑÑлка на обÑÐµÐºÑ ÑокÑаÑаеÑÑÑ Ð´Ð¾ OID во вÑÐµÐ¼Ñ ÑинÑакÑиÑеÑкого анализа и не ÑÑебÑÐµÑ Ð¿Ð¾ÑледÑÑÑего поиÑка.) ÐÑли Ð¸Ð¼Ñ ÑÑ
ÐµÐ¼Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð²ÑÑÑаиваеÑÑÑ Ñаким обÑазом, ÑледÑÐµÑ Ð·Ð°Ð¿ÑеÑиÑÑ Ð¿ÐµÑемеÑение Ñакого ÑаÑÑиÑениÑ, добавив его Ð¸Ð¼Ñ Ð² ÑпиÑок no_relocate поÑле ÑÑÑановки полÑзоваÑелÑÑкого ÑаÑÑиÑениÑ.
37.17.3. ÐонÑигÑÑаÑионнÑе ÑаблиÑÑ ÑаÑÑиÑений #
ÐекоÑоÑÑе ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð²ÐºÐ»ÑÑаÑÑ ÐºÐ¾Ð½ÑигÑÑаÑионнÑе ÑаблиÑÑ, ÑодеÑжаÑие даннÑе, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ Ð¸Ð»Ð¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð¿Ð¾Ð»ÑзоваÑелем поÑле ÑÑÑановки ÑаÑÑиÑениÑ. ÐбÑÑно, еÑли ÑаблиÑа ÑвлÑеÑÑÑ ÑаÑÑÑÑ ÑаÑÑиÑениÑ, ни опÑеделение ÑаблиÑÑ, ни ÐµÑ ÑодеÑжимое не бÑÐ´ÐµÑ Ð²ÑгÑÑжаÑÑÑÑ ÑÑилиÑой pg_dump. Ðо ÑÑо поведение нежелаÑелÑно Ð´Ð»Ñ ÐºÐ¾Ð½ÑигÑÑаÑионнÑÑ ÑÐ°Ð±Ð»Ð¸Ñ â изменениÑ, внеÑÑннÑе в Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелем, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑгÑÑжаÑÑÑÑ; в пÑоÑивном ÑлÑÑае ÑаÑÑиÑение бÑÐ´ÐµÑ Ð²ÐµÑÑи ÑÐµÐ±Ñ Ð¿Ð¾-дÑÑгомÑ, когда бÑÐ´ÐµÑ Ð·Ð°Ð³ÑÑжено вновÑ.
ЧÑÐ¾Ð±Ñ ÑеÑиÑÑ ÑÑÑ Ð¿ÑоблемÑ, ÑкÑÐ¸Ð¿Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼ÐµÑиÑÑ ÑозданнÑÑ Ð¸Ð¼ ÑаблиÑÑ Ð¸Ð»Ð¸ поÑледоваÑелÑноÑÑÑ ÐºÐ°Ðº конÑигÑÑаÑионное оÑноÑение, в ÑезÑлÑÑаÑе Ñего pg_dump вклÑÑÐ¸Ñ Ð² вÑгÑÑжаемÑе даннÑе ÑодеÑжимое (но не опÑеделение) ÑÑой ÑаблиÑÑ Ð¸Ð»Ð¸ поÑледоваÑелÑноÑÑи. ÐÐ»Ñ ÑÑого нÑжно вÑзваÑÑ ÑÑнкÑÐ¸Ñ pg_extension_config_dump(regclass, text) поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑаблиÑÑ Ð¸Ð»Ð¸ поÑледоваÑелÑноÑÑи, напÑÐ¸Ð¼ÐµÑ Ñак:
CREATE TABLE my_config (key text, value text);
CREATE SEQUENCE my_config_seq;
SELECT pg_catalog.pg_extension_config_dump('my_config', '');
SELECT pg_catalog.pg_extension_config_dump('my_config_seq', ''); Так можно помеÑиÑÑ Ð»Ñбое ÑиÑло ÑÐ°Ð±Ð»Ð¸Ñ Ð¸Ð»Ð¸ поÑледоваÑелÑноÑÑей, в Ñом ÑиÑле поÑледоваÑелÑноÑÑи, ÑвÑзаннÑе Ñо ÑÑолбÑами serial или bigserial.
Ðогда вÑоÑой аÑгÑÐ¼ÐµÐ½Ñ pg_extension_config_dump â пÑÑÑÐ°Ñ ÑÑÑока, pg_dump вÑгÑÑÐ¶Ð°ÐµÑ Ð²ÑÑ ÑодеÑжимое ÑаблиÑÑ. ÐбÑÑно ÑÑо пÑавилÑно, ÑолÑко еÑли поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑкÑипÑом ÑаÑÑиÑÐµÐ½Ð¸Ñ ÑÑа ÑаблиÑа изнаÑалÑно пÑÑÑа. ÐÑли же в ÑаблиÑе оказÑваеÑÑÑ ÑмеÑÑ Ð½Ð°ÑалÑнÑÑ
даннÑÑ
и даннÑÑ
, добавленнÑÑ
полÑзоваÑелем, во вÑоÑом аÑгÑменÑе pg_extension_config_dump пеÑедаÑÑÑÑ ÑÑловие WHERE, коÑоÑое оÑÑилÑÑÑовÑÐ²Ð°ÐµÑ Ð´Ð°Ð½Ð½Ñе, подлежаÑие вÑгÑÑзке. ÐапÑимеÑ, Ð¸Ð¼ÐµÑ ÑаблиÑÑ, ÑозданнÑÑ Ñаким обÑазом:
CREATE TABLE my_config (key text, value text, standard_entry boolean);
SELECT pg_catalog.pg_extension_config_dump('my_config', 'WHERE NOT standard_entry'); можно ÑделаÑÑ Ñак, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»Ðµ standard_entry ÑодеÑжало true ÑолÑко Ð´Ð»Ñ ÑÑÑок, ÑоздаваемÑÑ
ÑкÑипÑом ÑаÑÑиÑениÑ.
ÐÐ»Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑей вÑоÑой аÑгÑÐ¼ÐµÐ½Ñ ÑÑнкÑии pg_extension_config_dump не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениÑ.
Рболее ÑложнÑÑ ÑиÑÑаÑиÑÑ , когда полÑзоваÑели могÑÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑоваÑÑ Ð¸ изнаÑалÑно ÑÑÑеÑÑвовавÑие ÑÑÑоки, можно ÑоздаÑÑ ÑÑиггеÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½ÑигÑÑаÑионной ÑаблиÑÑ, коÑоÑÑе коÑÑекÑно помеÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑннÑе ÑÑÑоки.
УÑловие ÑилÑÑÑа, ÑвÑзанное Ñ ÐºÐ¾Ð½ÑигÑÑаÑионной ÑаблиÑей, можно измениÑÑ, повÑоÑно вÑзвав pg_extension_config_dump. (ÐбÑÑно ÑÑо наÑ
Ð¾Ð´Ð¸Ñ Ð¿Ñименение в ÑкÑипÑе Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑаÑÑиÑениÑ.) ÐдинÑÑвеннÑй ÑпоÑоб обознаÑиÑÑ, ÑÑо некоÑоÑÐ°Ñ ÑаблиÑа более не ÑвлÑеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑионной â ÑазоÑваÑÑ ÐµÑ ÑвÑÐ·Ñ Ñ ÑаÑÑиÑением командой ALTER EXTENSION ... DROP TABLE.
ÐамеÑÑÑе, ÑÑо оÑноÑÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑÐ½Ð¸Ñ ÐºÐ»ÑÑей Ð¼ÐµÐ¶Ð´Ñ ÑаблиÑами опÑеделÑÑÑ Ð¿Ð¾ÑÑдок, в коÑоÑом ÑÑи ÑаблиÑÑ Ð±ÑÐ´ÐµÑ Ð²ÑгÑÑжаÑÑ pg_dump. Ð ÑаÑÑноÑÑи, pg_dump попÑÑаеÑÑÑ Ð²ÑгÑÑзиÑÑ ÑнаÑала оÑновнÑÑ ÑаблиÑÑ, а заÑем подÑинÑннÑÑ. Так как оÑноÑÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑÐ½Ð¸Ñ ÐºÐ»ÑÑей ÑÑÑанавливаÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ CREATE EXTENSION (до загÑÑзки даннÑÑ Ð² ÑаблиÑÑ), ÑиклиÑеÑкие завиÑимоÑÑи не поддеÑживаÑÑÑÑ. Ðогда обÑазÑÑÑÑÑ ÑиклиÑеÑкие завиÑимоÑÑи, даннÑе Ñем не менее бÑдÑÑ Ð²ÑгÑÑженÑ, но полÑÑеннÑй аÑÑ Ð¸Ð² нелÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð²Ð¾ÑÑÑановиÑÑ Ð¾Ð±ÑÑнÑм обÑазом, поÑÑебÑеÑÑÑ Ð²Ð¼ÐµÑаÑелÑÑÑво полÑзоваÑелÑ.
ЧÑÐ¾Ð±Ñ ÑоÑ
ÑаниÑÑ ÑоÑÑоÑние поÑледоваÑелÑноÑÑей, ÑвÑзаннÑÑ
Ñо ÑÑолбÑами serial или bigserial, иÑ
нÑжно помеÑаÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно. ÐÐ»Ñ ÑÑой Ñели недоÑÑаÑоÑно помеÑиÑÑ ÑолÑко иÑ
ÑодиÑелÑÑкое оÑноÑение.
37.17.4. Ðбновление ÑаÑÑиÑений #
Ðдин из плÑÑов меÑ
анизма ÑаÑÑиÑений заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо он пÑедоÑÑавлÑÐµÑ ÑдобнÑе ÑпоÑÐ¾Ð±Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñми SQL-команд, опÑеделÑÑÑиÑ
обÑекÑÑ ÑаÑÑиÑениÑ. Ð ÑаÑÑноÑÑи, каждой вÑпÑÑкаемой веÑÑии ÑÑÑановоÑного ÑкÑипÑа ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð½Ð°Ð·Ð½Ð°ÑаеÑÑÑ Ð¸Ð¼Ñ Ð¸Ð»Ð¸ Ð½Ð¾Ð¼ÐµÑ Ð²ÐµÑÑии. ÐÑоме Ñого, еÑли Ð²Ñ Ñ
оÑиÑе, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑзоваÑели могли динамиÑеÑки обновлÑÑÑ Ð¾Ð´Ð½Ñ Ð²ÐµÑÑÐ¸Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð´Ð¾ дÑÑгой, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑедоÑÑавиÑÑ ÑкÑипÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ, коÑоÑÑе внеÑÑÑ Ð½ÐµÐ¾Ð±Ñ
одимÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿ÐµÑеÑ
ода Ð¾Ñ ÑÑаÑой веÑÑии к новой. СкÑипÑам обновлений назнаÑаÑÑÑÑ Ð¸Ð¼ÐµÐ½Ð°, ÑооÑвеÑÑÑвÑÑÑие ÑÐ°Ð±Ð»Ð¾Ð½Ñ (напÑимеÑ, ÑаÑÑиÑение--ÑÑаÑаÑ_веÑÑиÑ--новаÑ_веÑÑиÑ.sqlfoo--1.0--1.1.sql бÑÐ´ÐµÑ ÑодеÑжаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, менÑÑÑие веÑÑÐ¸Ñ 1.0 ÑаÑÑиÑÐµÐ½Ð¸Ñ foo на веÑÑÐ¸Ñ 1.1).
С ÑÑловием, ÑÑо имееÑÑÑ Ð¿Ð¾Ð´Ñ
одÑÑий ÑкÑÐ¸Ð¿Ñ ÑаÑÑиÑениÑ, команда ALTER EXTENSION UPDATE Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ ÑÑÑановленное ÑаÑÑиÑение до Ñказанной новой веÑÑии. СкÑÐ¸Ð¿Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑÑкаеÑÑÑ Ð² Ñом же окÑÑжении, коÑоÑое оÑганизÑÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° CREATE EXTENSION Ð´Ð»Ñ ÑÑÑановоÑнÑÑ
ÑкÑипÑов: в ÑаÑÑноÑÑи, search_path ÑÑÑанавливаеÑÑÑ Ñаким же обÑазом, а лÑбÑе новÑе обÑекÑÑ, ÑозданнÑе ÑкÑипÑом, авÑомаÑиÑеÑки добавлÑÑÑÑÑ Ð² ÑаÑÑиÑение. РеÑли ÑкÑÐ¸Ð¿Ñ ÑеÑÐ¸Ñ ÑдалиÑÑ Ð¾Ð±ÑекÑÑ-ÑÐ»ÐµÐ½Ñ ÑаÑÑиÑениÑ, они бÑдÑÑ Ð°Ð²ÑомаÑиÑеÑки иÑклÑÑÐµÐ½Ñ Ð¸Ð· его ÑоÑÑава.
ÐÑли Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ ÐµÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑпÑавлÑÑÑие ÑайлÑ, Ð´Ð»Ñ ÑкÑипÑа Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÑименÑÑÑÑÑ Ñе паÑамеÑÑÑ, коÑоÑÑе ÑвÑÐ·Ð°Ð½Ñ Ñ Ñелевой (новой) веÑÑией ÑкÑипÑа.
ALTER EXTENSION Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑи ÑкÑипÑов Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑенной веÑÑии. ÐапÑимеÑ, еÑли имеÑÑÑÑ ÑолÑко ÑкÑипÑÑ foo--1.0--1.1.sql и foo--1.1--2.0.sql, ALTER EXTENSION бÑÐ´ÐµÑ Ð¿ÑименÑÑÑ Ð¸Ñ
по поÑÑдкÑ, еÑли пÑи ÑÑÑановленной веÑÑии 1.0 запÑоÑено обновлении до веÑÑии 2.0.
Postgres Pro не Ð´ÐµÐ»Ð°ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
пÑедположений о ÑвойÑÑваÑ
имÑн веÑÑий: напÑимеÑ, он не знаеÑ, ÑледÑÐµÑ Ð»Ð¸ веÑÑÐ¸Ñ 1.1 за 1.0. Ðн пÑоÑÑо ÑопоÑÑавлÑÐµÑ Ð¸Ð¼ÐµÐ½Ð° имеÑÑиÑ
ÑÑ Ð²ÐµÑÑий и ÑледÑÐµÑ Ð¿ÑÑи, коÑоÑÑй ÑÑебÑÐµÑ Ð¿ÑимениÑÑ ÐºÐ°Ðº можно менÑÑе ÑкÑипÑов обновлений. (Ðменем веÑÑии на Ñамом деле Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»ÑÐ±Ð°Ñ ÑÑÑока, коÑоÑÐ°Ñ Ð½Ðµ ÑодеÑÐ¶Ð¸Ñ -- и пÑи ÑÑом не наÑинаеÑÑÑ Ð¸ не заканÑиваеÑÑÑ Ñимволом -.)
Ðногда бÑваÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ ÑкÑипÑÑ Â«Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð²ÐµÑÑии», напÑимеÑ, foo--1.1--1.0.sql, коÑоÑÑе позволÑÑÑ Ð¾ÑкаÑиÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, ÑвÑзаннÑе Ñ Ð²ÐµÑÑией 1.1. ÐÑли Ð²Ñ Ð¿ÑименÑеÑе иÑ
, ÑÑÑиÑе, ÑÑо еÑÑÑ Ð²ÐµÑоÑÑноÑÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñакого ÑкÑипÑа, еÑли он окажеÑÑÑ Ð² кÑаÑÑайÑем пÑÑи. РиÑÐºÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑиÑÑаÑÐ¸Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¿Ñи налиÑии ÑкÑипÑа Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ «коÑоÑÐºÐ¾Ð¼Ñ Ð¿ÑÑи», коÑоÑÑй пеÑепÑÑÐ³Ð¸Ð²Ð°ÐµÑ ÑеÑез неÑколÑко веÑÑий, и ÑкÑипÑа Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð²ÐµÑÑии до наÑалÑной ÑоÑки пеÑвого ÑкÑипÑа. Ð ÑезÑлÑÑаÑе Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑÑÑ Ñак, ÑÑо понижение веÑÑии Ñ Ð¿Ð¾ÑледÑÑÑим обновлением по коÑоÑÐºÐ¾Ð¼Ñ Ð¿ÑÑи окажеÑÑÑ Ð½Ð° неÑколÑко Ñагов коÑоÑе, Ñем поÑледоваÑелÑное повÑÑение веÑÑии. ÐÑли ÑкÑÐ¸Ð¿Ñ Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð²ÐµÑÑии ÑдалÑÐµÑ ÐºÐ°ÐºÐ¸Ðµ-либо незаменимÑе обÑекÑÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к нежелаÑелÑнÑм ÑезÑлÑÑаÑам.
ЧÑÐ¾Ð±Ñ ÑбедиÑÑÑÑ, ÑÑо пÑи обновлении не бÑÐ´ÐµÑ Ð²ÑбÑан нежелаÑелÑнÑй пÑÑÑ, воÑполÑзÑйÑеÑÑ ÑÑой командой:
SELECT * FROM pg_extension_update_paths('имÑ_ÑаÑÑиÑениÑ'); Ðна показÑÐ²Ð°ÐµÑ ÐºÐ°Ð¶Ð´ÑÑ Ð¿Ð°ÑÑ ÑазлиÑнÑÑ
извеÑÑнÑÑ
имÑн веÑÑий Ð´Ð»Ñ Ñказанного ÑаÑÑиÑениÑ, вмеÑÑе Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑбÑана Ð´Ð»Ñ Ð¿ÐµÑеÑ
ода Ð¾Ñ Ð¾Ð´Ð½Ð¾Ð¹ веÑÑии к дÑÑгой, либо NULL, еÑли пÑÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ наÑ
одиÑÑÑ. ÐÑÑÑ Ð²ÑводиÑÑÑ Ð² ÑекÑÑовом виде Ñ ÑазделиÑелÑми --. ÐÑли Ð²Ñ Ð¿ÑедпоÑиÑаеÑе ÑоÑÐ¼Ð°Ñ Ð¼Ð°ÑÑива, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑимениÑÑ regexp_split_to_array(path,'--').
37.17.5. УÑÑановка ÑаÑÑиÑений ÑкÑипÑами Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ #
РаÑÑиÑение, ÑÑÑеÑÑвÑÑÑее некоÑоÑое вÑемÑ, веÑоÑÑно, бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð½ÐµÑколÑко веÑÑий, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
авÑоÑÑ Ð½Ð°Ð´Ð¾ бÑÐ´ÐµÑ Ð¿Ð¸ÑаÑÑ ÑкÑипÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ. ÐапÑимеÑ, еÑли Ð²Ñ Ð²ÑпÑÑÑили ÑаÑÑиÑение foo веÑÑий 1.0, 1.1 и 1.2, Ñ Ð²Ð°Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑкÑипÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ foo--1.0--1.1.sql и foo--1.1--1.2.sql. Ðо Postgres Pro веÑÑии 10 необÑ
одимо бÑло Ñакже ÑоздаваÑÑ ÑÐ°Ð¹Ð»Ñ ÑкÑипÑов foo--1.1.sql и foo--1.2.sql, коÑоÑÑе ÑÑÑанавливаÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно новÑе веÑÑии ÑкÑипÑов; в пÑоÑивном ÑлÑÑае иÑ
можно бÑло ÑÑÑановиÑÑ, ÑолÑко ÑÑÑановив 1.0 и пÑÐ¾Ð¸Ð·Ð²ÐµÐ´Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ. ÐÑо бÑло ÑÑомиÑелÑно и неÑÑÑекÑивно, но ÑепеÑÑ Ñакой необÑ
одимоÑÑи неÑ, Ñак как команда CREATE EXTENSION Ð¼Ð¾Ð¶ÐµÑ Ñама поÑÑÑоиÑÑ ÑепоÑÐºÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¹. ÐапÑимеÑ, еÑли имеÑÑÑÑ ÑолÑко ÑÐ°Ð¹Ð»Ñ ÑкÑипÑов foo--1.0.sql, foo--1.0--1.1.sql и foo--1.1--1.2.sql, Ñо запÑÐ¾Ñ Ð½Ð° ÑÑÑÐ°Ð½Ð¾Ð²ÐºÑ Ð²ÐµÑÑии 1.2 ÑдовлеÑвоÑÑеÑÑÑ Ð·Ð°Ð¿ÑÑком ÑÑиÑ
ÑÑÑÑ
ÑкÑипÑов по оÑеÑеди. ÐÑо не бÑÐ´ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð¾Ñ ÑÑÑановки веÑÑии 1.0 Ñ Ð¿Ð¾ÑледÑÑÑим обновлением до 1.2. (Ðак и Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ ALTER EXTENSION UPDATE, пÑи налиÑии неÑколÑкиÑ
пÑÑей вÑбиÑаеÑÑÑ ÑамÑй коÑоÑкий.) ÐÑганизаÑÐ¸Ñ ÑкÑипÑов ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñакой ÑÑ
еме Ð¼Ð¾Ð¶ÐµÑ ÑпÑоÑÑиÑÑ ÑопÑовождение неболÑÑиÑ
обновлений.
ÐÑли Ð²Ñ Ð¸ÑполÑзÑеÑе дополниÑелÑнÑе (оÑиенÑиÑованнÑе на веÑÑиÑ) ÑпÑавлÑÑÑие ÑÐ°Ð¹Ð»Ñ Ð´Ð»Ñ ÑаÑÑиÑениÑ, поддеÑживаемого по Ñакой ÑÑ
еме, имейÑе в видÑ, ÑÑо ÑпÑавлÑÑÑий Ñайл нÑжен Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ веÑÑии, даже еÑли Ð´Ð»Ñ Ð½ÐµÑ Ð½ÐµÑ Ð¾ÑделÑного ÑкÑипÑа ÑÑÑановки, Ñак как ÑÑÐ¾Ñ Ñайл бÑÐ´ÐµÑ Ð¾Ð¿ÑеделÑÑÑ, как пÑоизвеÑÑи неÑвное обновление до ÑÑой веÑÑии. ÐапÑимеÑ, еÑли в Ñайле foo--1.0.control задаÑÑÑÑ requires = 'bar', а в дÑÑгиÑ
ÑпÑавлÑÑÑиÑ
ÑайлаÑ
foo â неÑ, завиÑимоÑÑÑ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¾Ñ bar бÑÐ´ÐµÑ Ñдалена пÑи обновлении Ñ Ð²ÐµÑÑии 1.0 до дÑÑгой.
37.17.6. ÐамеÑÐ°Ð½Ð¸Ñ Ð¾ безопаÑноÑÑи ÑаÑÑиÑений #
ШиÑоко ÑаÑпÑоÑÑÑанÑемÑе ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑÑоиÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð¿Ñедположений оÑноÑиÑелÑно Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , в коÑоÑой они Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ. Таким обÑазом, ÑÑнкÑии, пÑедоÑÑавлÑемÑе ÑаÑÑиÑениÑми, ÑледÑÐµÑ Ð¿Ð¸ÑаÑÑ Ð² безопаÑном ÑÑиле, Ñак, ÑÑÐ¾Ð±Ñ Ð¸Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð±Ñло ÑкомпÑомеÑиÑоваÑÑ Ð² аÑÐ°ÐºÐ°Ñ Ñ Ð¸ÑполÑзованием пÑÑи поиÑка.
РаÑÑиÑение, Ñ ÐºÐ¾ÑоÑого ÑвойÑÑво superuser Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение true, должно бÑÑÑ Ñакже заÑиÑено Ð¾Ñ ÑгÑоз безопаÑноÑÑи, ÑвÑзаннÑÑ
Ñ Ð´ÐµÐ¹ÑÑвиÑми, коÑоÑÑе вÑполнÑÑÑÑÑ Ð¿Ñи ÑÑÑановке и обновлении ÑаÑÑиÑениÑ. ÐÐ»Ñ Ð·Ð»Ð¾Ð½Ð°Ð¼ÐµÑенного полÑзоваÑÐµÐ»Ñ Ð½Ðµ ÑоÑÑÐ°Ð²Ð¸Ñ Ð±Ð¾Ð»ÑÑого ÑÑÑда ÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ Ñипа ÑÑоÑнÑкого конÑ, коÑоÑÑй впоÑледÑÑвии ÑкомпÑомеÑиÑÑÐµÑ Ð²Ñполнение неаккÑÑаÑно напиÑанного ÑкÑипÑа ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¸ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ ÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÑÑаÑÑ ÑÑпеÑполÑзоваÑелем.
ÐÑли ÑаÑÑиÑение Ð¸Ð¼ÐµÐµÑ Ñ
аÑакÑеÑиÑÑÐ¸ÐºÑ trusted, вÑзÑваÑÑий полÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑаÑÑ ÑÑ
емÑ, в коÑоÑÑÑ Ð¾Ð½Ð¾ бÑÐ´ÐµÑ ÑÑÑанавливаÑÑÑÑ. ÐÑи ÑÑом он Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°Ð¼ÐµÑенно вÑбÑаÑÑ Ð½ÐµÐ±ÐµÐ·Ð¾Ð¿Ð°ÑнÑÑ ÑÑ
ÐµÐ¼Ñ Ð² надежде полÑÑиÑÑ Ñаким обÑазом пÑава ÑÑпеÑполÑзоваÑелÑ. ÐоÑÑÐ¾Ð¼Ñ Ð´Ð¾Ð²ÐµÑенное ÑаÑÑиÑение кÑайне ÑÑзвимо Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи, Ñак ÑÑо вÑе ÑодеÑжаÑиеÑÑ Ð² его ÑкÑипÑаÑ
ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð½ÐµÐ¾Ð±Ñ
одимо ÑÑаÑелÑно пÑовеÑÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¸ÑклÑÑиÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÐµÐ³Ð¾ компÑомеÑаÑии.
СовеÑÑ Ð¿Ð¾ безопаÑÐ½Ð¾Ð¼Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÑÑнкÑий пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð½Ð¸Ð¶Ðµ в ÐодÑазделе 37.17.6.1, а ÑовеÑÑ Ð¿Ð¾ напиÑÐ°Ð½Ð¸Ñ ÑÑÑановоÑнÑÑ ÑкÑипÑов â в ÐодÑазделе 37.17.6.2.
37.17.6.1. ÐамеÑÐ°Ð½Ð¸Ñ Ð¾ безопаÑноÑÑи ÑÑнкÑий в ÑаÑÑиÑениÑÑ #
ФÑнкÑии, ÑеализованнÑе в ÑаÑÑиÑениÑÑ Ð½Ð° ÑзÑÐºÐ°Ñ SQL и PL*, подвеÑÐ¶ÐµÐ½Ñ Ð°Ñакам Ñ Ð¸ÑполÑзованием пÑÑи поиÑка во вÑÐµÐ¼Ñ Ð²ÑполнениÑ, Ñак как ÑинÑакÑиÑеÑкий ÑÐ°Ð·Ð±Ð¾Ñ ÑÑÐ¸Ñ ÑÑнкÑий Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÑо, когда они вÑполнÑÑÑÑÑ, а не когда ÑоздаÑÑÑÑ.
Ðа ÑÑÑаниÑе CREATE FUNCTION даÑÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñй ÑÐ¾Ð²ÐµÑ Ð¿Ð¾ безопаÑÐ½Ð¾Ð¼Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÑÑнкÑий Ñ Ñ
аÑакÑеÑиÑÑикой SECURITY DEFINER. ÐÑи пÑиÑÐ¼Ñ ÑекомендÑеÑÑÑ Ð¿ÑименÑÑÑ Ð¸ Ð´Ð»Ñ ÑÑнкÑий, пÑедоÑÑавлÑемÑÑ
ÑаÑÑиÑениÑми, Ñак как Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелем Ñ ÑаÑÑиÑеннÑми пÑавами.
ÐÑли Ð²Ñ Ð½Ðµ можеÑе оÑÑавиÑÑ Ð² search_path ÑолÑко безопаÑнÑе ÑÑ
емÑ, ÑÑиÑайÑе, ÑÑо каждое заданное без ÑÑ
ÐµÐ¼Ñ Ð¸Ð¼Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑазÑеÑено в обÑекÑ, ÑозданнÑй злонамеÑеннÑм полÑзоваÑелем. ÐзбегайÑе конÑÑÑÑкÑий, Ñвно завиÑÑÑиÑ
Ð¾Ñ search_path; напÑимеÑ, IN и CASE вÑегда вÑбиÑаÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð¿Ð¾ пÑÑи поиÑка. ÐмеÑÑо ниÑ
ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑии вÑÑажение WHENOPERATOR( и ÑÑ
ема.=) ANYCASE WHEN .вÑÑажение
РаÑÑиÑÐµÐ½Ð¸Ñ Ð¾Ð±Ñего назнаÑÐµÐ½Ð¸Ñ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑаÑÑÑиÑÑваÑÑ Ð½Ð° Ñо, ÑÑо они ÑÑÑанавливаÑÑÑÑ Ð² безопаÑнÑÑ ÑÑ
емÑ, ÑÑо ознаÑаеÑ, ÑÑо даже ÑÑÑлаÑÑÑÑ Ð½Ð° ÑобÑÑвеннÑе обÑекÑÑ Ñ Ñказанием ÑÑ
ÐµÐ¼Ñ Ð² ниÑ
небезопаÑно. ÐапÑимеÑ, еÑли в ÑаÑÑиÑении опÑеделена ÑÑнкÑÐ¸Ñ myschema.myfunc(bigint), ÐµÑ Ð²Ñзов в виде myschema.myfunc(42) можно пеÑеÑ
ваÑиÑÑ, Ñоздав ÑпеÑиалÑнÑÑ ÑÑнкÑÐ¸Ñ myschema.myfunc(integer). ÐозабоÑÑÑеÑÑ Ð¾ Ñом, ÑÑÐ¾Ð±Ñ ÑÐ¸Ð¿Ñ Ð¿Ð°ÑамеÑÑов ÑÑнкÑий и опеÑаÑоÑов в ÑоÑноÑÑи ÑооÑвеÑÑÑвовали обÑÑвленнÑм Ñипам иÑ
аÑгÑменÑов, и иÑполÑзÑйÑе ÑвнÑе пÑиведениÑ, где ÑÑо необÑ
одимо.
37.17.6.2. ÐамеÑÐ°Ð½Ð¸Ñ Ð¾ безопаÑноÑÑи ÑкÑипÑов ÑаÑÑиÑений #
СкÑÐ¸Ð¿Ñ ÑÑÑановки или Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ ÑледÑÐµÑ Ð·Ð°ÑиÑаÑÑ Ð¾Ñ Ð°Ñак, оÑÑÑеÑÑвлÑемÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ Ð¸ÑполÑзованием пÑÑи поиÑка. ÐÑли Ð¸Ð¼Ñ Ð¾Ð±ÑекÑа, коÑоÑÑй должен иÑполÑзоваÑÑÑÑ Ð² ÑкÑипÑе по замÑÑÐ»Ñ Ð°Ð²ÑоÑа, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑазÑеÑено в какой-либо дÑÑгой обÑекÑ, компÑомеÑаÑÐ¸Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¿ÑоизойдÑÑ ÑÑÐ°Ð·Ñ Ð»Ð¸Ð±Ð¾ позже, когда обÑÐµÐºÑ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ.
ÐÐ¾Ð¼Ð°Ð½Ð´Ñ DDL, напÑÐ¸Ð¼ÐµÑ CREATE FUNCTION и CREATE OPERATOR CLASS, в Ñелом безопаÑнÑ, но бÑдÑÑе бдиÑелÑÐ½Ñ Ð² оÑноÑении команд, в коÑоÑÑÑ
ÑигÑÑиÑÑÑÑ Ð¿ÑоизволÑнÑе запÑоÑÑ Ð¸ вÑÑажениÑ. ÐапÑимеÑ, ÑÑебÑÑÑ Ð¿ÑовеÑки ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE VIEW, а Ñакже вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ DEFAULT в CREATE FUNCTION.
Ðногда в ÑкÑипÑе ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¿Ð¾ÑÑебноÑÑÑ Ð²ÑполниÑÑ Ð¿ÑоизволÑнÑй SQL, напÑимеÑ, ÑÑÐ¾Ð±Ñ Ð²Ð½ÐµÑÑи в каÑалог изменениÑ, невозможнÑе ÑеÑез DDL. Ð ÑÑом ÑлÑÑае обÑзаÑелÑно вÑполнÑйÑе Ñакие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑм search_path; не довеÑÑйÑе пÑÑи, ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð¾Ð¼Ñ Ð¿Ñи вÑполнении CREATE/ALTER EXTENSION. ÐÐ»Ñ ÑÑого ÑекомендÑеÑÑÑ Ð²Ñеменно ÑмениÑÑ search_path на pg_catalog, pg_temp и добавиÑÑ ÑвнÑе ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÑÑ
емÑ, в коÑоÑÑÑ ÑÑÑанавливаеÑÑÑ ÑаÑÑиÑение, везде, где ÑÑо ÑÑебÑеÑÑÑ. (ÐÑÐ¾Ñ Ð¿ÑиÑм Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ пÑи Ñоздании пÑедÑÑавлений.)
СÑÑлки на дÑÑгие ÑаÑÑиÑÐµÐ½Ð¸Ñ ÐºÑайне Ñложно полноÑÑÑÑ Ð¾Ð±ÐµÐ·Ð¾Ð¿Ð°ÑиÑÑ, оÑÑаÑÑи из-за оÑÑÑÑÑÑÐ²Ð¸Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ, в какой ÑÑ
еме наÑ
одиÑÑÑ Ð´ÑÑгое ÑаÑÑиÑениÑ. РиÑки ÑменÑÑаÑÑÑÑ, еÑли оба ÑаÑÑиÑÐµÐ½Ð¸Ñ ÑÑÑанавливаÑÑÑÑ Ð² Ð¾Ð´Ð½Ñ ÑÑ
емÑ, Ñак как в ÑÑом ÑлÑÑае зловÑеднÑй обÑÐµÐºÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð¿ÐµÑед обÑекÑами в ÑÑ
еме Ñелевого ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¿Ñи иÑполÑзÑемом во вÑÐµÐ¼Ñ ÑÑÑановки search_path. Ðднако в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½ÐµÑ Ð¼ÐµÑ
анизма, коÑоÑÑй Ð±Ñ ÑÑо ÑÑебовал. ÐоÑÑÐ¾Ð¼Ñ Ð½Ð° даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑекомендÑеÑÑÑ Ð½Ðµ помеÑаÑÑ ÑаÑÑиÑение как довеÑенное, еÑли оно завиÑÐ¸Ñ Ð¾Ñ Ð´ÑÑгиÑ
, не ÑÑиÑÐ°Ñ ÑеÑ
, ÑÑо Ñже ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð² ÑÑ
ÐµÐ¼Ñ pg_catalog.
37.17.7. ÐÑÐ¸Ð¼ÐµÑ ÑаÑÑиÑÐµÐ½Ð¸Ñ #
ÐдеÑÑ Ð¿ÑедÑÑавлен полнÑй пÑÐ¸Ð¼ÐµÑ ÑаÑÑиÑениÑ, в коÑоÑом ÑÑедÑÑвами иÑклÑÑиÑелÑно SQL ÑеализÑеÑÑÑ ÑоÑÑавной Ñип Ñ Ð´Ð²ÑÐ¼Ñ ÑлеменÑами, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ ÑÐ¾Ñ ÑаниÑÑ Ð² ÑÐ²Ð¾Ð¸Ñ ÑлоÑÐ°Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð»Ñбого Ñипа, названнÑе «k» и «v». ÐÐ»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð²Ñе знаÑÐµÐ½Ð¸Ñ Ð¿ÐµÑеводÑÑÑÑ Ð² ÑекÑÑовÑй ÑоÑÐ¼Ð°Ñ (еÑли они имеÑÑ Ð´ÑÑгой ÑоÑмаÑ).
Файл ÑкÑипÑа pair--1.0.sql вÑглÑÐ´Ð¸Ñ Ñак:
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION pair" to load this file. \quit
CREATE TYPE pair AS ( k text, v text );
CREATE FUNCTION pair(text, text)
RETURNS pair LANGUAGE SQL AS 'SELECT ROW($1, $2)::@extschema@.pair;';
CREATE OPERATOR ~> (LEFTARG = text, RIGHTARG = text, FUNCTION = pair);
-- "SET search_path" is easy to get right, but qualified names perform better.
CREATE FUNCTION lower(pair)
RETURNS pair LANGUAGE SQL
AS 'SELECT ROW(lower($1.k), lower($1.v))::@extschema@.pair;'
SET search_path = pg_temp;
CREATE FUNCTION pair_concat(pair, pair)
RETURNS pair LANGUAGE SQL
AS 'SELECT ROW($1.k OPERATOR(pg_catalog.||) $2.k,
$1.v OPERATOR(pg_catalog.||) $2.v)::@extschema@.pair;';
УпÑавлÑÑÑий Ñайл pair.control вÑглÑÐ´Ð¸Ñ Ñак:
# ÑаÑÑиÑение pair comment = 'Тип даннÑÑ Ð´Ð»Ñ Ð¿Ð°ÑÑ ÐºÐ»ÑÑ/знаÑение' default_version = '1.0' # ÑаÑÑиÑение не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑемеÑаемÑм, Ñак как иÑполÑзÑÐµÑ @extschema@ relocatable = false
ХоÑÑ Ð²Ð°Ð¼ вÑÑд ли понадобиÑÑÑ ÑбоÑоÑнÑй Ñайл, ÑолÑко Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑÑÑановиÑÑ ÑÑи два Ñайла в нÑжнÑй каÑалог, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Makefile ÑледÑÑÑего ÑодеÑжаниÑ:
EXTENSION = pair DATA = pair--1.0.sql PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS)
ÐÑÐ¾Ñ Makefile опиÑаеÑÑÑ Ð½Ð° инÑÑаÑÑÑÑкÑÑÑÑ PGXS, коÑоÑÐ°Ñ Ð¾Ð¿Ð¸ÑÑваеÑÑÑ Ð² Разделе 37.18. С ним команда make install ÑÑÑÐ°Ð½Ð¾Ð²Ð¸Ñ ÑпÑавлÑÑÑий Ñайл и ÑкÑÐ¸Ð¿Ñ Ð² пÑавилÑнÑй каÑалог, коÑоÑÑй опÑÐµÐ´ÐµÐ»Ð¸Ñ pg_config.
Ðогда ÑÑи ÑÐ°Ð¹Ð»Ñ Ð±ÑдÑÑ ÑÑÑановленÑ, вÑполниÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE EXTENSION, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð³ÑÑзиÑÑ Ð¾Ð±ÑекÑÑ Ð² опÑеделÑннÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
.