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


201

我是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

我知道问题出在串行类型上。这就是为什么我授予www的* _id_seq选择,插入和删除权限的原因。但这不能解决我的问题。我想念什么?


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

Answers:


359

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

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

授予使用权限-对于序列,此特权允许使用currval和nextval函数。

同样,正如@epic_fil在注释中指出的,您可以使用以下方式授予对模式中所有序列的权限:

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

52
仅供参考,还支持语法“ ..。。。。。。.。
epic_fil

5
有趣。我在序列所在的表上全部进行了GRANT操作,但这似乎无法覆盖序列。这在OS上也很常见。
Kinnard Hockenhull 2014年

41
这真是一件好事吗?什么时候允许用户将数据插入表中,而又不想让用户使用列之一是自动递增的事实呢?
Brett Widmeier

5
IS SELECT有必要吗?不应该USAGE涵盖所需内容吗?
TᴀʀᴇǫMᴀʜᴍᴏᴏᴅ

6
@BrettWidmeier正是。对我来说,开发人员如何容忍这种事情真是让我感到很惊讶。就像人们想在Internet上漫游并阅读无底的StackOverflow线程,以试图解决那些本来应该可以正常工作的问题。
milosmns

67

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

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

2
请注意,这仅在PostgreSQL 9.0及更高版本中有效,要在8中完成相同操作,您可以执行以下操作:SELECT'GRANT USAGE,SELECT ON'|| quote_ident(schemaname)|| '。|| quote_ident(relname)|| “到www;” FROM pg_statio_all_sequences WHERE schemaname ='public'; – Tom Gerken 2天前
Tom Gerken

39

@ 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+。

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


-2

在postgres中执行以下命令。

登录到postgres:

sudo su postgres;

psql dbname;

创建序列public.cities_id_seq INCREMENT 1
MINVALUE 0
MAXVALUE 1
START 1 CACHE 1; ALTER TABLE public.cities_id_seq拥有者pgowner;

pgowner将是您的数据库用户。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.