将plsql函数迁移到pgplsql(postgresql 9.5)

时间:2017-07-10 16:18:14

标签: postgresql plpgsql database-migration

我试图将下一个函数迁移到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中禁用和启用约束,我不想在这部分删除它们。我读到我可以改变检查约束(这是我唯一的约束类型)无效,但我没有在谷歌上找到任何例子。请帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

您只能在NO VALID上为ADD CONSTRAINT设置CHECK CONSTRAINT标记,因此您无法先删除旧的ALTER TABLE ...VALIDATE。因此" ENABLE"这将是ALTER TABLE ... DISABLE TRIGGER ALL,它将锁定表并重新检查所有数据(重新)验证它。

FK约束是唯一可以"舒适" "禁用/启用"通过param然后启用它们。

但总之,上述程序与Postgres处理约束的方式有很大的不同,我怀疑你在这里会有多大成功。可能你必须保存所有现有约束的定义,删除它们并从已保存的定义重新创建到"启用" ...