在使用.NET 3.5中的Npgsql (2.0.11和2.0.11.94) DLL使用Postgresql时,我遇到了一个非常奇怪的bug。
我已经创建了一个程序来运行这两个查询(这两个查询是直接从程序输出中复制的):
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和Postgres8.4.12和9.0.9上运行得很好,并且可以按照需要将数据输入到表中。
但是,在Windows 7上运行完全相同的程序时,如果数据库的设置方式与Windows XP数据库完全相同,我就会遇到以下错误:
ERROR: 42P01: relation "db_events" does not exist
我读到这个错误是因为postgres强制表名称为小写,这很好,因为它们已经是小写了。或者,使用引号创建的表必须使用引号引用,这也没有问题,因为我使用的是引号。
在Windows7数据库中,如果我将这两个查询复制并粘贴到pgadmin中,它们工作正常,没有错误,这让我相信这与DLL有关?
不合理的是,这个程序在我的Windows XP系统上运行时没有bug,而在Windows 7上却不断抛出这个错误。
我还尝试了一个简单的delete语句:
DELETE FROM "db_events"; DELETE FROM "db_events_counts";
但这也以同样的错误结束。
我是不是遗漏了什么?Npgsql是否需要在与运行时相同的windows环境中编译?或者,windows7和带有postgres的windows XP之间有什么细微的区别,而我却不明白。
任何关于这个主题的帮助或信息都将不胜感激。
由于关于连接的问题,以下是我尝试过的:
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
发布于 2012-08-27 13:55:33
这里看到的奇怪和反复无常的行为,以及评论中的讨论,表明系统目录(在pg_catalog
模式中)可能已经被直接修改-可能是试图REVOKE
某些权限。
这不是个好主意。系统目录实际上应该只由专家修改。这是只有超级用户帐户才能直接修改它们的原因之一,也是您不应该在日常操作中使用超级用户帐户的原因之一。
除非您确切地知道做了什么并且可以撤消它,否则我建议恢复到数据库的工作副本,就像您已知良好的XP机器上的副本一样。GRANT
在pg_catalog
中访问public
听起来很有帮助,但谁知道还做了些什么呢。
如果这是我的数据库,我会获取每个数据库的pg_dump
和一个pg_dumpall --globals-only
,并将其恢复到一个备用数据库,以确保它看起来是完整的。然后我会停止Pg并重新初始化数据库。不过,这在Windows上有点麻烦,所以你可能只需要备份损坏的数据库,DROP
ping它,重新创建它,然后将数据恢复到其中。
发布于 2012-08-27 11:22:44
在CraigRinger的帮助下解决了这个问题。
即使我登录的用户是数据库的所有者,他也没有权限查看公共模式下的任何内容。
这是使用以下命令发现的:
select * from public.db_events
它抛出了一个access is denied
错误,而不是抛出relation not found
错误。
在更改了我作为角色登录的用户并勾选了“superuser
特权”下的所有复选框后,relation not found
错误不再发生。
发布于 2019-05-21 07:26:36
PostgreSQL将所有标识符转换为小写。这是PostgreSQL行为,与Npgsql无关-后者只是在您编写SQL时传递它。您可以切换到全小写的表名,在这种情况下,您不再需要引号。
https://stackoverflow.com/questions/12135177
复制相似问题