第14章 PostGIS 扩展跨 Schema 迁移指南
第14章 将 PostGIS 扩展迁移到其他 schema 从 PostGIS 2.3 开始,postgis 扩展不再支持重新定位,扩展内部的所有函数调用都带上了 schema 前缀。 这一改动虽然解决了数据库恢复中的一些问题,却给另一类用户带来了新麻烦:他们当初把扩展装在了某个 schema 里,现在想把它搬到新的 schema。好在是有办法做到的。 本文先在默认 schema 下安装 PostGIS,然后演示如何把它移到另一个 schema。 你可以用 psql、pgAdmin 或任何其他 PostgreSQL 工具来执行这些步骤。 大多数人的默认 schema 是 public,所以不显式指定安装 schema 时,postgis 会装到 public 里。 CREATE EXTENSION postgis; 现在新建一个 schema 用来存放它,并把该 schema 加入 search_path: CREATE SCHEMA postgis;
ALTER DATABASE mydb SET search_path = public,postgis;
GRANT USAGE ON SCHEMA postgis to public; 如果你用的是 PostGIS 2.3 及以上版本,按常规方法尝试移动 schema 会报错: ALTER EXTENSION postgis SET SCHEMA postgis; ERROR: extension "postgis" does not support SET SCHEMA 要完成迁移,请按以下步骤操作: -- 临时将 postgis 设为可重定位 UPDATE pg_extension SET extrelocatable = true WHERE extname = 'postgis';
-- 执行重定位 ALTER EXTENSION postgis SET SCHEMA postgis;
-- 强制升级到一个占位版本 -- PostGIS 3.5.0 及以上版本执行: ALTER EXTENSION postgis UPDATE TO "ANY";
-- PostGIS 3.4 及以下版本执行: ALTER EXTENSION postgis UPDATE TO "3.4.3next";
-- 再强制一次升级,完成真正的版本升级 ALTER EXTENSION postgis UPDATE; 注意版本号中的 next 或 ANY。之所以需要这一步,是因为扩展系统不允许同版本之间的升级,只有先“升级”到一个带 next 的版本或 ANY,才能绕过这个限制。 最后一次升级会真正把扩展升级到已安装的最新版本。在这个过程中,所有函数会被重新安装,脚本中的 @extschema@ 变量此时指向新的 schema 位置。 注意:如果你还安装了 postgis_raster 和/或 postgis_sfcgal,请对它们重复上述步骤。这两个扩展必须与 postgis 装在同一个 schema 中,否则无法正常工作。