ChatGPT解决这个技术问题 Extra ChatGPT

错误:使用 Postgres 拒绝序列 city_id_seq 的权限

我是 postgres 的新手(以及数据库信息系统的新手)。我在我的数据库上运行了以下 sql 脚本:

create table cities (
id serial primary key,
name text not null
);

create table reports (
id serial primary key,
cityid integer not null references cities(id),
reportdate date not null,
reporttext text not null
);

create user www with password 'www';

grant select on cities to www;
grant insert on cities to www;
grant delete on cities to www;

grant select on reports to www;
grant insert on reports to www;
grant delete on reports to www;

grant select on cities_id_seq to www;
grant insert on cities_id_seq to www;
grant delete on cities_id_seq to www;

grant select on reports_id_seq to www;
grant insert on reports_id_seq to www;
grant delete on reports_id_seq to www;

当用户 www 尝试:

insert into cities (name) values ('London');

我收到以下错误:

ERROR: permission denied for sequence cities_id_seq

我知道问题出在串行类型上。这就是为什么我将 *_id_seq 的选择、插入和删除权限授予 www。然而,这并不能解决我的问题。我错过了什么?

授予对序列的插入/删除对我来说没有意义。我很惊讶它甚至可以工作。

T
ThangLeQuoc

从 PostgreSQL 8.2 开始,您必须使用:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

GRANT USAGE - 对于序列,此权限允许使用 currval 和 nextval 函数。

正如@epic_fil 在评论中指出的那样,您可以通过以下方式授予架构中所有序列的权限:

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO www;

注意:在执行权限授予命令之前不要忘记选择数据库(\c <database_name>


仅供参考,还支持语法“...... ON ALL SEQUENCES IN SCHEMA schema_name”。
有趣的。我在我的序列所在的表上做了一个 GRANT all,但这似乎并没有涵盖序列。这似乎也很受操作系统的影响。
这是怎么回事?我什么时候想要允许用户将数据插入表中,但不想让他们使用其中一列是自动递增的事实?
SELECT 是否必要? USAGE 不应该涵盖所需内容吗?
@BrettWidmeier 没错。开发人员如何容忍这种事情让我感到震惊。这就像人们想在 Internet 上漫游并阅读无底的 StackOverflow 线程,以试图修复本应开箱即用的问题。
T
Tom Gerken

由于@Phil 的评论获得了很多可能不会引起注意的赞成票,因此我正在使用他的语法添加一个答案,该答案将授予用户对架构中所有序列的权限(假设您的架构是默认的“公共” )

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public to www;

请注意,这只适用于 PostgreSQL 9.0 及更高版本,要在 8 中完成相同的操作,您可以执行以下操作: SELECT 'GRANT USAGE, SELECT ON ' ||报价标识(模式名)|| '。' || quote_ident(relname) || '到 www;' FROM pg_statio_all_sequences WHERE schemaname = 'public'; – 汤姆·格肯 2 天前
该版本 8 的解决方法可以挽救生命。我最初很难弄清楚如何使用它。我必须使用该查询来生成一个新查询列表,然后我必须发出它。一击就能做到这一点有诀窍吗?我还在“ON”之后插入了“SEQUENCES”
A
Asfand Qazi

@Tom_Gerken、@epic_fil 和 @kupson 的声明非常正确,他们授予使用现有序列的权限。但是,用户将无法获得未来创建的序列的访问权限。为此,您必须将 GRANT 语句与 ALTER DEFAULT PRIVILEGES 语句结合起来,如下所示:

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO www;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT USAGE, SELECT ON SEQUENCES TO www;

当然,这只适用于 PostgreSQL 9+。

这将附加到现有的默认权限,而不是覆盖它们,因此在这方面非常安全。


C
Codemaker

这是由于 SEQUENCES 的权限问题。

尝试以下命令来解决问题,

GRANT USAGE, SELECT ON SEQUENCE sequence_name TO user_name;

例如:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

S
Shreeram

在 postgres 中执行以下命令。

登录到 postgres:

sudo su postgres; psql 数据库名;创建序列 public.cities_id_seq INCREMENT 1 MINVALUE 0 MAXVALUE 1 START 1 CACHE 1;更改表 public.cities_id_seq 所有者到 pgowner;

pgowner 将是您的数据库用户。