1 回答
TA贡献1869条经验 获得超4个赞
您的问题包含大量问题,并没有足够的信息来完全解决其中任何一个问题,因此我将尝试提供一些故障排除步骤,以帮助您找到解决方案。
问题#1
命令:
INSERT INTO campaigns (userid, app, from_name, from_email, reply_to, title, label, plain_text, html_text, query_string, bounce_setup, complaint_setup, wysiwyg, opens_tracking, links_tracking) VALUES (2, 152, 'Person Name', 'campaignsupport@company.com', 'campaignsupport@company.com', 'Test', '', 'Test plain text.', 'asdf', '', 0, 0, 1, 1, 1)
失败并出现错误:
pg_query(): Query failed: ERROR: permission denied for table campaigns
但是,当您在 Navicat 中运行它时,您可以执行此 SQL 命令。
在您描述的上下文中,发生此错误的原因只有几个:
您没有使用具有所需权限的用户(可能不是您认为连接的用户)连接到数据库。要检查您与问题查询连接的用户:
SELECT current_user;
使用与失败查询相同的连接,从您的应用程序内部发出此问题,紧接在失败查询之前。将输出记录在您可以看到的地方 - 例如。apache 错误日志。
从 Navicat 发出相同的查询以查看在那里使用的用户。如果与正在使用的应用程序不同,则与同一用户重新连接并查看查询是否仍然失败。
该表没有您认为的权限授予。
我不熟悉 Navicat:它可能提供检查表权限的方法。如果没有(或者如果它不起作用,请参见下文),那么您可以使用psql命令行工具进行连接并使用命令\z campaigns 查看表上的一组授权。
您并没有访问您认为自己访问的表,可能需要与您认为正在访问的表不同的权限。如果架构路径导致选择了不同架构中的同名表,则可能会发生这种情况。但是我认为这不会发生,因为您提到您已尝试指定完全限定名称public.campaigns。
您没有连接到正确的数据库。您声明您已经检查了这一点 - 如果您已经达到这一点但仍然没有找到原因,我建议再次检查!
问题#2
无论我使用什么尝试使用有效的 SQL 语句使用 PHP 运行查询,我都没有得到任何数据。
简化后,您的代码如下所示:
$r = pg_query($mysqli, $q);
if ($r)
{
// do something
}
我不是 php 专家,但检查文档pg_query我发现它说:
如果发生错误,并且返回 FALSE,则可以在连接有效的情况下使用 pg_last_error() 函数检索错误的详细信息。
您没有检查任何错误情况。我猜查询失败了,可能是上面提到的权限问题。我建议else在调用pg_last_error()和显示结果的代码中添加一个子句。
问题 #3
Navicat 显示此错误:
ERROR: Column "proisagg" doe snot exist
LINE 1: ...e JOIN pg_language lng ON lng.oid=p.prolang WHERE proisagg = ..
HINT: Perhaps you meant to reference the column "p.prolang".
直到 postgresql 11,内部 postgresql 表pg_proc包含一个列 proisagg,如果该行表示聚合函数,则该列为真。
从 Postgresql 11 开始,此列被替换为prokind具有不同值的列,以描述该行是否表示聚合函数、窗口函数、普通函数或过程。
如上所述,我不熟悉 Navicat,但我猜您使用的版本尚未更新以考虑此更改。
- 1 回答
- 0 关注
- 456 浏览
添加回答
举报