我是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。然而,这并不能解决我的问题。我错过了什么?
答案 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将是您的数据库用户。