我是 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。然而,这并不能解决我的问题。我错过了什么?
从 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>:在执行权限授予命令之前不要忘记选择数据库( )
\c <database_name>