【问题标题】:Migrating plsql function to pgplsql (postgresql 9.5)将 plsql 函数迁移到 pgplsql (postgresql 9.5)
【发布时间】:2017-12-14 11:35:37
【问题描述】:

我正在尝试将下一个函数迁移到 PostgreSQL:

CREATE OR REPLACE FUNCTION mar.change_const (command text) RETURNS 
VOID AS $body$
DECLARE

C_Procedure_Name   CONSTANT   varchar(30) := 'change_constraints';
V_Step                        real := 0;
/* command values: ENABLE | DISABLE */
all_constraints CURSOR(stat text) FOR
       SELECT *
       FROM   all_constraints
       WHERE  status = stat;
cons                          all_constraints%ROWTYPE;
line                          varchar(200);
cons_status                   varchar(10);
BEGIN
RAISE NOTICE 'Start : %, %', C_Procedure_Name, TO_CHAR(clock_timestamp());
V_Step := 1;
IF command IN ('enable', 'ENABLE') THEN
  cons_status := 'DISABLED';
ELSE
  cons_status := 'ENABLED';
END IF;
V_Step := 2;
FOR cons IN all_constraints(cons_status)
LOOP
    V_Step := 2.1;
    line := 'alter table ' || cons.table_name || ' ' || command ||
            ' novalidate constraint ' || CONS.CONSTRAINT_NAME;
    V_Step := 2.2;
    EXECUTE line;
END LOOP;

我知道我可以使用information_schema.table_constraints 切换 all_constraints,但是如何更改代码的其他部分?我无法在 PostgreSQL 中禁用和启用约束,我不想在这一部分中删除它们。

我读到我可以将检查约束(这是我唯一的约束类型)更改为 novalidate,但我在搜索引擎中没有找到任何示例。

【问题讨论】:

  • 使用 format() 函数。这至少可以解决引用问题。

标签: postgresql plpgsql database-migration


【解决方案1】:

您只能在ADD CONSTRAINT 上为检查约束设置NO VALID 标记,因此如果不先删除旧的CHECK CONSTRAINT,就无法做到这一点。因此,此处的“ENABLE”将是 ALTER TABLE ...VALIDATE,它将锁定表并检查所有数据(重新)验证它。

FK 约束是唯一可以通过ALTER TABLE ... DISABLE TRIGGER ALL“轻松”“禁用/启用”然后再启用它们的类型。

但简而言之,上面的过程与 Postgres 处理约束的方式有很大不同,我怀疑你在这里会成功。可能您必须保存所有现有约束的定义,删除它们并从保存的定义重新创建以“启用”...

【讨论】:

  • 是否有任何 postgresql 函数将对象作为参数(例如约束)并返回用于它的创建命令?
  • 适用于任何类型 - 没有。可以使用select pg_get_constraintdef(oid) from pg_constraint where conname = 'b_i_fkey'; 对约束进行部分 DDL
猜你喜欢
  • 2017-06-19
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多