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

tzcvj98z  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(2)|浏览(194)

我使用QGIS 3.2.4将PostGIS2.5模式的名称从public更改为supervisor;

在那之后,我发现我的数据现在无法显示几何图形。如果您检查pgAdmin 4中的几何图形列,它现在显示**“supervisor.geometry”而不是“geometry”**
看看geom列如何与

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

n6lpvg4x

n6lpvg4x1#

您已经以用户Postgres(可以在数据库中做任何想做的事情)的身份登录并重命名了公共模式,现在存储在公共模式中的扩展不再工作。
老实说,这句话里的一切都是错的。
将其重命名为public-小写,这应该可以解决您的直接问题。
然后,决定你想要什么:在另一个方案中有postgis函数?禁止在public中创建对象?默认情况下允许在另一个方案中创建新对象?将GIS表移动到另一个方案?
然后阅读有关在另一个模式中安装或移动Postgis扩展,有关创建新用户,有关创建新模式,有关向用户授予对模式和表的使用/读/写访问权限,有关设置search_path等。
最后但并非最不重要的是,请记住以下两个提示:
1.保持公共模式不变(如果您愿意,可以阻止用户使用它)
1.永远不要使用超级用户帐户(如Postgres)来执行日常任务(相反,创建不同的数据库用户,只需为其任务提供足够的权限即可。如果用户只需要对几个表进行读/写,则不需要删除整个数据库)

fiei3ece

fiei3ece2#

由于"$user", public的默认search_path设置(数据库设置,而不是环境变量),您以前所知道的geometry实际上是public.geometry
每当你引用一个表、类型或任何没有指定模式的东西时,Postgres首先检查是否有一个模式与你当前的用户同名("$user"),如果该对象在其中。然后它检查了public,因为它是PostGIS类型和函数默认所在的位置,它实际上还检查pg_catalog的内置内容,以及特定于会话的pg_temp_nnn,其中您的temp对象。
现在您将public重命名为Supervisorrrrrgeometry不再位于它在search_path列表中检查的任何架构中。

select set_config( 'search_path'
                  ,(current_setting('search_path')||', "Supervisorrrrr"')
                  ,false);

但你最好把它改回来以免弄坏其他东西。

alter schema "Supervisorrrrr" rename to public;

如果你想把你的东西从public中移出来,运行一系列的alter

create schema "Supervisorrrrr";
alter table public.your_table set schema "Supervisorrrrr";
alter view public.your_view set schema "Supervisorrrrr";

为了在将来保持整洁(-er/-ish),您可以

  • 要求用户始终使用模式限定的名称,这可能会带来不便
  • 为您的每个用户创建一个专用的私有模式,以他们的用户名命名。这样,默认情况下,他们的内容最终会在他们的模式中,而不会干扰Wild West Re public中的其他内容。
  • 如果你是一个人工作,或者这是一个一次性的GIS实验室,你不想修修补补太多,只清理一下,下次你(或其他人)想建立和修改结构
create schema your_new_schema_for_new_stuff;
set search_path = your_new_schema_for_new_stuff, public;

这样,后续的查询将在默认情况下针对新的模式,而不会乱丢public,同时仍然能够引用public中的类型和函数。

  • 默认情况下,不要作为超级用户操作-不在数据库中,不在操作系统中,不在任何地方。

相关问题