如何在 Postgresql 中将序列从一个模式复制到另一个模式?

How can I copy sequences from one schema to another in Postgresql?

objective 是在将表从架构 schema 1 复制到新架构 schema 2 后,使用以下方法弄清楚如何执行此操作[=28] =]

create table if not exists {schema 2}.{lime_table} (like {schema 1}.{lime_table} including all);

insert into {schema 2}.{lime_table} (select * from {schema 1}.{lime_table});

使用此方法在模式之间复制表会使 schema 2 中的序列指向 schema 1 中的序列。为了用 schema 1 删除 dependencies/coupling,我在 schema 2 中创建了相同的序列,脚本使用了像

这样的模板
create sequence
    if not exists {schema_2_dot_sequence_name}
    increment by 1
    minvalue 1
    maxvalue 2147483647
    start {start_with} -- taken from `schema 1`.sequence.last_val
    cache 1
    no cycle
    owned by {schema_2_dot_table_dot_id_field_name}
;

然后使用

更改了schema 2中的id列
alter table {schema_2_dot_table}
    alter column {id_field_name}
        set default nextval({schema_2_dot_sequence}::regclass)

进行这些数据库更改后,我将我的应用程序 (Limesurvey) 指向 schema 2

现在,当尝试将记录插入 schema 2 时,会抛出错误 currval of sequence "<sequence_name>" is not yet defined in this session。如果我将我的应用程序指向 schema 1(创建新数据库 connection/session),我不会收到此错误,所以这让我认为我执行的“迁移”序列是错误的。该应用正在使用 php 函数 lastInsertId

更新: 我做了一个 pg_dump 并没有在输出中找到 schema 1 的任何实例,所以也许我所做的迁移工作在那里是应用程序某处指向 schema 1...

的配置

查看堆栈跟踪后,我发现了对 schema 1 的引用。例如,C:\...\CDbCommandBuilder.php(62): CDbConnection->getLastInsertID("public.lime_user_groups_ugid_seq"),其中 publicschema 1。因为 schema 1 没有出现在 pg_dump 中,我知道这一定是应用程序配置的问题。我发现在 https://forums.limesurvey.org/forum/installation-a-update-issues/111790-installation-on-a-different-schema 的帮助下,代码库中有一些隐藏的 schema 1 字符串需要更改。这意味着我用于 migrate/copy 表及其从一个模式到另一个模式的序列的方法有效。

更新:问题出在应用程序配置中。我们的数据库使用与两个 pg 服务器的 pgpool 连接。连接到池会产生错误。直接连接到 main/master pg 服务器后它就消失了。