我在 QGIS 中更改了 Postgis Schema 名称,现在我的几何列已损坏,我该如何修复

问题描述 投票:0回答:2

我使用 QGIS 3.2.4 将 PostGIS2.5 Schema 的名称从 public 更改为 supervisorchanging schema name in qgis

之后我发现我的数据现在无法显示几何。如果您检查 pgAdmin4 中的几何列,它现在显示为 "supervisor.geometry" 而不是 "geometry"

查看 geom 列的样子 see how the geom column looks like

当我尝试在 pgAdmin 中更改列的数据类型时,它显示 "geometry" 数据类型不再存在,可以找到的是 supervisor.geometry

list of data types now available

datatype geometry nolonger exists

postgresql postgis qgis
2个回答
1
投票

你已经以用户 Postgres 的身份登录(他大概可以在数据库中做任何想做的事)并重命名了公共模式,现在存储在公共模式中的扩展不再工作了。

老实说,这句话里的一切都是错的。

将其重命名为

public
- 小写,这应该可以解决您的直接问题。

然后,决定你想要什么:在另一个模式中有 postgis 功能?防止在

public
中创建对象?默认允许在另一个模式中创建新对象?将您的 GIS 表移动到另一个模式?

然后阅读有关在另一个模式中安装或移动

Postgis
扩展、创建新用户、创建新模式、向用户授予对模式和表的使用/读/写访问权限、设置
search_path
等。

最后但同样重要的是,请记住以下两个提示:

  1. 单独保留公共模式(相反,如果您愿意,可以阻止用户使用它)
  2. 永远不要在日常任务中使用超级用户帐户,例如
    Postgres
    读/写几个表)

1
投票

你以前知道的

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),您可以

  • 要求您的用户始终使用模式限定名称,这可能会带来不便
  • 为您的每个用户创建专用的私有模式,以他们的用户名命名。这样默认情况下,他们的东西最终会出现在他们的模式中,而不会干扰狂野西部的其他人 Re
    public
    .
  • 如果你是一个人工作和/或那是一个一次性的 GIS 实验室,你不会对它进行太多修补,只需稍微清理一下,下次你(或其他人)想要构建和修改结构时
    create schema your_new_schema_for_new_stuff;
    set search_path = your_new_schema_for_new_stuff, public;
    
    这样,后续查询将默认以新模式为目标,而不会乱扔垃圾
    public
    ,同时仍然能够引用
    public
    .
  • 中的类型和函数
  • 默认情况下不要以超级用户身份操作 - 不在数据库中,不在您的操作系统中,不在任何地方。
© www.soinside.com 2019 - 2024. All rights reserved.