7

在 .NET 3.5 中使用 Npgsql(2.0.11 和 2.0.11.94)DLL 使用 Postgresql 时,我遇到了一个非常奇怪的错误。

我创建了一个程序来运行这两个查询(这些是直接从程序输出中复制的):

INSERT INTO "db_events" VALUES ('2','1','2','1', to_timestamp('2012/08/27 10:22:43', 'YYYY/MM/DD HH24:MI:SS'),'2012', '8', '27', '10', '22', '43', '35' );

INSERT INTO "db_events_counts" VALUES ('1','2', '0', '1', '0', '1' );

该程序将在 Windows XP x86 和 postgres 8.4.12 和 9.0.9 上完美运行,并将按应有的方式将数据输入到表中。

但是,当在 Windows 7 上运行完全相同的程序并使用与 Windows XP 数据库相同的方式设置的数据库时,我遇到了错误:

ERROR: 42P01: relation "db_events" does not exist

我读过这个错误是因为 postgres 强制表名小写,这很好,因为它们已经是。或者用引号创建的表必须用引号引用,这也很好,因为我使用的是引号。

在 Windows 7 数据库中,如果我将这两个查询复制并粘贴到 pgadmin 中,它们工作正常,没有错误,这让我相信这与 DLL 有关吗?

没有意义的是该程序在我的 Windows XP 系统上运行无错误,而在 Windows 7 上不断抛出此错误。

我还尝试了一个简单的删除语句:

DELETE FROM "db_events"; DELETE FROM "db_events_counts";

但这也以同样的错误告终。

有什么我想念的吗?Npgsql 是否需要在与它运行时相同的 Windows 环境中编译?或者 Windows 7 和 Windows XP 之间是否存在一些我没有得到的带有 postgres 的细微差别。

任何有关该主题的帮助或信息将不胜感激。


由于有关连接的问题,这是我尝试过的:

Server=localhost;Port=5433;User Id=databaseuser;Password=databaseuser_123;Database=db123;
Server=127.0.0.1;Port=5433;User Id=databaseuser;Password=databaseuser_123;Database=db123;
Server=10.223.132.123;Port=5433;User Id=databaseuser;Password=databaseuser_123;Database=db123;

最后一个是本地机器的 IP 地址。


这是 Win 7 上与服务器连接和断开连接的程序的简短日志:
//正在连接

2012-08-27 11:26:00 EST ERROR:  relation "db_events" does not exist at character 13
2012-08-27 11:26:00 EST STATEMENT:  DELETE FROM "db_events"; DELETE FROM "db_events_counts";
2012-08-27 12:52:29 EST ERROR:  relation "db_events" does not exist at character 13
2012-08-27 12:52:29 EST STATEMENT:  INSERT INTO "db_events" VALUES ('114','1','2','1', to_timestamp('2012/08/27 12:52:29', 'YYYY/MM/DD HH24:MI:SS'),'2012', '8', '27', '12', '52', '29', '35' );

// 断开连接

2012-08-27 11:26:07 EST LOG:  could not receive data from client: No connection could be made because the target machine actively refused it.
2012-08-27 11:26:07 EST LOG:  unexpected EOF on client connection
4

3 回答 3

6

这里看到的奇怪和不稳定的行为以及评论中的讨论表明系统目录(在模式中)可能已被直接修改 - 可能是对某些权限pg_catalog的尝试。REVOKE

这不是一个好主意。系统目录实际上应该只由专家修改。这是只有超级用户帐户才能直接修改它们的原因之一,也是您不应该在日常操作中使用超级用户帐户的众多原因之一。

除非您确切地知道做了什么并且可以撤消它,否则我建议您恢复到数据库的工作副本,例如您已知良好的 XP 机器上的那个。GRANT访问publicinpg_catalog听起来很有帮助,但谁知道还做了什么。

如果这是我的数据库,我会从pg_dump每个数据库中提取一个pg_dumpall --globals-only并将其还原到备用数据库,以确保它看起来完整。然后我会停止 Pg 并重新初始化数据库。不过,这在 Windows 上有点痛苦,因此您可能只需备份损坏的数据库、DROPping 它、重新创建它并将数据恢复回其中就可以了。

于 2012-08-27T05:55:32.933 回答
1

在 CraigRinger 的帮助下想通了。

即使我登录的用户是数据库的所有者,他也无权查看公共模式下的任何内容。

这是使用以下方法发现的:
select * from public.db_events

哪个,而不是抛出一个relation not found错误,抛出一个access is denied错误。

将我登录的用户更改为 asuperuser并勾选“角色权限”下的所有复选框后,该relation not found错误不再发生。

于 2012-08-27T03:22:44.107 回答
0

PostgreSQL 将所有标识符折叠为小写。这是 PostgreSQL 的行为,与 Npgsql 无关 - 后者只是在您编写 SQL 时传递您的 SQL。您可以切换到全小写的表名,在这种情况下您不再需要引号。

于 2019-05-20T23:26:35.900 回答