如何将 postgis 对象和函数定义加载到单独的模式中?

Posted

技术标签:

【中文标题】如何将 postgis 对象和函数定义加载到单独的模式中?【英文标题】:How do you load postgis object and function definitions into a separate schema? 【发布时间】:2012-03-26 12:10:42 【问题描述】:

我不想将我的所有表定义放入与使用标准 PostGIS 安装过程 (http://postgis.refractions.net/docs/ch02.html) 创建的 PostGIS 定义相同的公共架构中。

有人对使用 PostGIS 时如何将事物组织成单独的模式有任何建议吗?

【问题讨论】:

【参考方案1】:

正如我刚刚在您的 related preceding question 上回答的那样,我建议 根本不要为您的对象使用 public 架构。为 PostGis 等扩展保留它,并为您的对象使用一个或多个单独的架构。

公共架构与数据库中的任何其他架构没有任何不同。 PostgreSQL 根本不需要它。它恰好是许多扩展放置它们的东西的默认模式。所以把你的东西放在其他地方,然后在你需要的地方设置search_path

然后你也可以创建对应的用户,匹配预设search_path。基本设置可能如下所示:

CREATE ROLE sales;
ALTER ROLE sales SET search_path=sales, public; -- postgis functions in public?
COMMENT ON ROLE sales IS 'Sales app uses this user to connect.';

CREATE ROLE sales_admin;
ALTER ROLE sales_admin SET search_path=sales, public;
COMMENT ON ROLE sales_admin IS 'Owns objects in schema sales.';

CREATE SCHEMA sales;
GRANT ALL ON SCHEMA sales TO sales_admin;
GRANT USAGE ON SCHEMA sales TO sales;
COMMENT ON SCHEMA sales IS 'All objects for my sales app here.'

您还会对DEFAULT PRIVILEGES 的用户或架构感兴趣。更多在这个密切相关的问题下:Grant all on a specific schema in the db to a group role in PostgreSQL

【讨论】:

【参考方案2】:
--start out with it in public:
create extension postgis;

--add other extensions that depend on postgis being in public schema like postgis_tiger_geocoder

--then move it 
create schema postgis;

grant all on schema postgis to public;

alter database [database_name] set search_path = "$user", public, postgis;

alter extension postgis set schema postgis;

【讨论】:

很棒的答案!我还刚刚学会了如何使用内置数据库search_path 管理我的其他模式。谢谢!

以上是关于如何将 postgis 对象和函数定义加载到单独的模式中?的主要内容,如果未能解决你的问题,请参考以下文章

postgis将multi和geometrycollection转换成为多行数据,自定义函数

postgis将multi和geometrycollection转换成为多行数据,自定义函数

postgis将multi和geometrycollection转换成为多行数据,自定义函数

如何将纬度/经度对转换为 PostGIS 地理类型?

如何将 PostGIS 添加到 PostgreSQL pgAdmin?

超融合时序数据库YMatrixDB与PostGIS案例