如何在数据迁移期间重命名架构并删除对初始架构(PostgreSQL)的依赖性?

时间:2019-01-26 18:55:59

标签: postgresql data-migration

PostgreSQL 11.1

我正在将开发的“数据库”转移到其第一个“真实的” beta测试环境中。初始模式是NOVA,它是当前正在运行的应用程序所依赖的模式。经过几年的发展,新的架构-新的应用程序将在其上运行-是PHOENIX。

在开发期间(超过两年),使用表,约束,触发器等对NOVA模式进行了修改,修改,删除和添加。但是,架构名称仍为NOVA。

这是我所做的:

  1. 安装了最新版本的PostgreSQL 11.1。
  2. 使用Pg_Dump获取工作的NOVA数据库的当前数据,然后使用Pg_restore将模式和数据导入PostgreSQL 11.1。
  3. 在开发数据库中将NOVA SCHEMA重命名为PHOENIX。这不会与初始(有效的)nova模式冲突。
  4. 使用Pg_dump和pg_restore将新的Phoenix模式(带有开发数据)引入PostgreSQL 11.1。

现在,我的总体计划(非常欢迎提出建议!)是,首先从当前使用的NOVA模式中的数据更新PHOENIX中的表,而没有任何外键。通常,从外键最少的表到外键最多的表。

因此,为了回答外键数量的基本问题,我从此开始(在Pg_Admin 4 v4.1中执行)(Get Table Foreign Keys):

SET search_path TO Phoenix;

SELECT

    current_schema() AS "schema",
    current_catalog AS "database",
    "pg_constraint".conrelid::regclass::text AS "primary_table_name",
    "pg_constraint".confrelid::regclass::text AS "foreign_table_name",

    (
        string_to_array(
            (
                string_to_array(
                    pg_get_constraintdef("pg_constraint".oid),
                    '('
                )
            )[2],
            ')'
        )
    )[1] AS "foreign_column_name",

    "pg_constraint".conindid::regclass::text AS "constraint_name",

    TRIM((
        string_to_array(
            pg_get_constraintdef("pg_constraint".oid),
            '('
        )
    )[1]) AS "constraint_type",

    pg_get_constraintdef("pg_constraint".oid) AS "constraint_definition"

FROM pg_constraint AS "pg_constraint"

JOIN pg_namespace AS "pg_namespace" ON "pg_namespace".oid = "pg_constraint".connamespace

WHERE
    --fkey and pkey constraints
    "pg_constraint".contype IN ( 'f', 'p' )
    AND
    "pg_namespace".nspname = current_schema()
    -- AND
    -- "pg_constraint".conrelid::regclass::text IN ('whatever_table_name')

结果表如下(如何在SO中将其格式化为表?)

  

模式数据库primary_table_name foreign_table_name foreign_column_name     约束名称约束类型定义   名称名称文字文字文字文字文字文字

     

“凤凰”     “混乱”“ nova.referral_details”“ nova.orders”“ orderno”“ nova.orderno_unique”“对外   KEY“”外键(orderno)参考nova.orders(orderno)更新   级联删除限制”

重要的一点是,尽管该架构已从NOVA重命名为PHOENIX,但似乎约束,触发器等仍在引用开发NOVA表!

因此, 如何修复PHOENIX模式以显示对NOVA的依赖性? (或者,有没有更好的方法可以将旧模式上的新数据移动到新模式而又不更改旧模式?)

对此表示感谢,并提供所有帮助。

注意:这里的总体目标是允许当前运行的前端应用程序不受NOVA模式的影响,而较新的应用程序可以使用新的PHOENIX模式进行Beta测试。

0 个答案:

没有答案