我有一个名为test with id column的表。并且id列已通过名为“test_id_seq”的序列进行更新。该测试表由用户“A”创建,另一个用户“B”具有读取权限。从用户“B”创建表的转储时。使用以下评论
pg_dump -U B -t test rafiu > test.sql
显示错误,如
pg_dump:[archiver(db)]查询失败:错误:关系test_id_seq的权限被拒绝
是否有任何选项只能转储表格?
答案 0 :(得分:9)
您是否尝试使用-T
选项忽略序列?
pg_dump -U B -T test_id_seq rafiu > test.sql
这应该是没有那个序列的pgdump。
答案 1 :(得分:3)
当一个列“拥有”序列时,它会被它转储,因此生成转储的用户必须有权访问它(GRANT SELECT ON sequence_name TO username
)
使用SERIAL
/ BIGSERIAL
伪数据类型时会发生这种情况。但是,之后仍然可以通过发出以下命令从列中分离序列:
ALTER SEQUENCE test_id_seq OWNED BY none;
之后,为序列分配test.ID
的默认值将继续照常工作,但pg_dump不会尝试使用表转储序列。
如果从一开始就使用预先存在的序列(不使用SERIAL
)创建表格,那么结果是相同的,而不需要ALTER SEQUENCE。
示例:
create sequence seq1;
create table test1 (id int default nextval('seq1'));
在这种情况下,表格将被pg_dump -t test1
转储为:
CREATE TABLE test1 (
id integer DEFAULT nextval('seq1'::regclass)
);
没有对seq1
的其他引用,也无需阅读权限。