AWS Aurora PostgreSQL 12 上使用PostGIS扩展

本文档根据AWS官方文档整理而成,在中国区宁夏区域Aurora PostgreSQL 12.11版本,机型为db.r6g.large集群上测试,并使用SQL Workbench/J 128.3 (Build 2022-07-03) 作为客户端测试通过。

首先正常创建数据库。

一、使用管理员用户创建PostGIS需要的用户和角色

查看所有插件和版本:

SELECT * FROM pg_available_extension_versions WHERE name='postgis';

执行如下命令:

CREATE ROLE gis_admin LOGIN PASSWORD 'change_me';
GRANT rds_superuser TO gis_admin;
CREATE DATABASE lab_gis;
GRANT ALL PRIVILEGES ON DATABASE lab_gis TO gis_admin;

二、加载 PostGIS 扩展

这里需要更换登录数据库的用户为上一步新创建的gis_admin用户。

执行如下命令:

CREATE EXTENSION postgis;
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION postgis_topology;

执行如下命令检查上一步是否正确执行。

SELECT n.nspname AS "Name",
  pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
  FROM pg_catalog.pg_namespace n
  WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
  ORDER BY 1;

如果返回如下结果,则表示上一步成功。

NameOwner
publicpostgres
tigerrdsadmin
tiger_datardsadmin
topologyrdsadmin

三、移交扩展的所有权

ALTER SCHEMA tiger OWNER TO gis_admin;
ALTER SCHEMA tiger_data OWNER TO gis_admin; 
ALTER SCHEMA topology OWNER TO gis_admin;

执行如下命令检查上一步是否正确执行。

SELECT n.nspname AS "Name",
  pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
  FROM pg_catalog.pg_namespace n
  WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
  ORDER BY 1;

如果返回如下结果,则表示上一步成功。

NameOwner
publicpostgres
tigergis_admin
tiger_datagis_admin
topologygis_admin

四、移交 PostGIS 对象的所有权

使用以下函数将 PostGIS 对象的所有权移交给 gis_admin 角色。从 psql 提示符处运行以下语句以创建此函数。

CREATE FUNCTION exec(text) returns text language plpgsql volatile AS $f$ BEGIN EXECUTE $1; RETURN $1; END; $f$;

接下来,运行以下查询以运行 exec 函数,该函数进而将运行语句并更改权限。

SELECT exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' || quote_ident(s.relname) || ' OWNER TO gis_admin;')
  FROM (
    SELECT nspname, relname
    FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid) 
    WHERE nspname in ('tiger','topology') AND
    relkind IN ('r','S','v') ORDER BY relkind = 'S')
s;

五、测试扩展

使用以下命令将 tiger 添加到搜索路径中。

SET search_path=public,tiger;

使用以下 SELECT 语句测试 tiger。

SELECT na.address, na.streetname, na.streettypeabbrev, na.zip
 FROM normalize_address('1 Devonshire Place, Boston, MA 02109') AS na;

测试后返回如下结果表示正常:

addressstreetnamestreettypeabbrevzip
1DevonshirePl02109

使用以下 SELECT 语句测试 topology。

SELECT topology.createtopology('my_new_topo',26986,0.5);

六、升级插件版本

在数据库升级后,如果需要升级插件版本,可执行如下命令:

SELECT PostGIS_Extensions_Upgrade();

七、参考文档

https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.PostGIS.html