我使用 QGIS 3.2.4 将 PostGIS2.5 Schema 的名称从 public 更改为 supervisor;
之后我发现我的数据现在无法显示几何。如果您检查 pgAdmin4 中的几何列,它现在显示为 "supervisor.geometry" 而不是 "geometry"
查看 geom 列的样子
当我尝试在 pgAdmin 中更改列的数据类型时,它显示 "geometry" 数据类型不再存在,可以找到的是 supervisor.geometry
你已经以用户 Postgres 的身份登录(他大概可以在数据库中做任何想做的事)并重命名了公共模式,现在存储在公共模式中的扩展不再工作了。
老实说,这句话里的一切都是错的。
将其重命名为
public
- 小写,这应该可以解决您的直接问题。
然后,决定你想要什么:在另一个模式中有 postgis 功能?防止在
public
中创建对象?默认允许在另一个模式中创建新对象?将您的 GIS 表移动到另一个模式?
然后阅读有关在另一个模式中安装或移动
Postgis
扩展、创建新用户、创建新模式、向用户授予对模式和表的使用/读/写访问权限、设置 search_path
等。
最后但同样重要的是,请记住以下两个提示:
Postgres
读/写几个表)你以前知道的
geometry
实际上是 public.geometry
多亏了 search_path
的默认
"$user", public
设置(数据库设置,而不是环境变量)。
每当您引用表、类型或任何未指定模式的内容时,Postgres 首先检查是否存在与当前用户 (
"$user"
) 同名的模式,以及该对象是否在其中。然后它检查了public
,因为默认情况下它是PostGIS类型和函数所在的位置,所以它起作用了。它实际上还检查 pg_catalog
的内置内容以及特定于会话的 pg_temp_nnn
您的 temp
对象所在的位置。
现在您已将
public
重命名为 Supervisorrrrr
,geometry
不再位于它正在检查 search_path
列表的任何架构中。你可以跑
select set_config( 'search_path'
,(current_setting('search_path')||', "Supervisorrrrr"')
,false);
但是你最好把它改回去,以免破坏其他东西。
alter schema "Supervisorrrrr" rename to public;
如果你想从
public
搬出你的东西,运行一系列alter
s:
create schema "Supervisorrrrr";
alter table public.your_table set schema "Supervisorrrrr";
alter view public.your_view set schema "Supervisorrrrr";
为了将来保持整洁(-er/-ish),您可以
public
.create schema your_new_schema_for_new_stuff;
set search_path = your_new_schema_for_new_stuff, public;
这样,后续查询将默认以新模式为目标,而不会乱扔垃圾 public
,同时仍然能够引用 public
.