在postgres中转储没有序列表的表

时间:2013-11-22 09:38:55

标签: postgresql postgresql-9.1

我有一个名为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的权限被拒绝

是否有任何选项只能转储表格?

2 个答案:

答案 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的其他引用,也无需阅读权限。