错误:使用Postgres对序列cities_id_seq的权限被拒绝

时间:2012-02-17 08:24:32

标签: sql postgresql permissions auto-increment

我是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。然而,这并不能解决我的问题。我错过了什么?

5 个答案:

答案 0 :(得分:264)

自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;

答案 1 :(得分:57)

由于@Phil的评论得到了很多可能没有被注意到的赞成,我使用他的语法添加了一个答案,该答案将为模式中的所有序列授予用户权限(假设您的模式是默认的' public')

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

答案 2 :(得分:29)

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

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

答案 3 :(得分:0)

这是由于 SEQUENCES 的权限问题。

尝试以下命令解决问题,

GRANT USAGE, SELECT ON SEQUENCE sequence_name TO user_name;

例如:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

答案 4 :(得分:-1)

在postgres中执行以下命令。

登录到postgres:

  
    

sudo su postgres;

         

psql dbname;

         

创建序列public.cities_id_seq     增量1
    最小值0
    最大值1
    开始1     缓存1;     更改表public.cities_id_seq拥有者pgowner;

  

pgowner将是您的数据库用户。