0

我正在尝试在 Ubuntu 16.04 LTS 上运行 postgresql 数据库。

sudo apt-get install postgresql首先,我使用安装的 9.5.1 版本安装了 postgres 。然后我创建了另一个用户和一个新数据库。我已将新数据库的所有权限授予新用户,并将所有者也设置为新用户。

我连接到新数据库并通过使用\i /path/to/dump.sql. 我没有收到任何错误,然后当我输入时,\dt我得到了带有表格的列表。

问题是:当我现在断开(\q)并重新连接(与我之前连接的相同sudo psql -U "username" dbname)并再次键入\dt时,它显示“未找到关系”。当我尝试再次填充它时,我收到一堆错误,例如“关系关系名称已经存在”。

当我尝试使用 pgAdmin(通过 安装sudo apt-get install pgadmin3)时,会出现另一个问题/症状。尝试使用 localhost 进行连接时,我无法使用新创建的用户(我可以从终端连接)进行连接。但是我可以使用我通过终端设置的密码使用 postgres 进行连接。我没有看到我从 pgAdmin 的命令行手动创建的任何数据库

所以是的,我的猜测是至少有一个问题可能是 9.2 和 9.5 之间的版本不兼容。有什么方法可以测试/解决这个问题吗?但我也认为应该还有其他问题。

4

1 回答 1

1

如果 SQL 转储包含将SET search_path TO...其设置为与用户默认值不同的值的命令,则可能会发生您所描述的情况。

因此,它不仅会在该模式中创建其表和其他对象,而且会将其留给search_path会话的其余部分,因此当您\dt在同一会话中执行此操作时,它确实会看到并列出新创建的表。

但是当您退出并重新输入 psql 时,这search_path不再有效,您将返回到search_path您的用户的默认值,据说它不会到达架构,因此\dt不再“看到”任何表。

您可以使用show search_path在 psql 会话中检查此设置,并在 SQL 文件中使用 grep "SET search_path" 来检查它的设置。


根据评论,情况似乎是这样:转储将表创建到用户默认搜索路径之外的模式中。

该用户无缝工作的可能解决方案是更新其搜索路径,以便它始终首先到达此模式。这可以通过以下方式完成:

ALTER USER username SET search_path TO schema1,"$user",public;

schema1SQL 转储引用的内容以及创建表的位置在哪里。

于 2016-05-06T12:08:15.553 回答