本文档根据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;
如果返回如下结果,则表示上一步成功。
Name | Owner |
---|---|
public | postgres |
tiger | rdsadmin |
tiger_data | rdsadmin |
topology | rdsadmin |
三、移交扩展的所有权
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;
如果返回如下结果,则表示上一步成功。
Name | Owner |
---|---|
public | postgres |
tiger | gis_admin |
tiger_data | gis_admin |
topology | gis_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;
测试后返回如下结果表示正常:
address | streetname | streettypeabbrev | zip |
---|---|---|---|
1 | Devonshire | Pl | 02109 |
使用以下 SELECT 语句测试 topology。
SELECT topology.createtopology('my_new_topo',26986,0.5);
六、升级插件版本
在数据库升级后,如果需要升级插件版本,可执行如下命令:
SELECT PostGIS_Extensions_Upgrade();