我试图将下一个函数迁移到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中禁用和启用约束,我不想在这部分删除它们。我读到我可以改变检查约束(这是我唯一的约束类型)无效,但我没有在谷歌上找到任何例子。请帮助,谢谢。
答案 0 :(得分:1)
您只能在NO VALID
上为ADD CONSTRAINT
设置CHECK CONSTRAINT
标记,因此您无法先删除旧的ALTER TABLE ...VALIDATE
。因此" ENABLE"这将是ALTER TABLE ... DISABLE TRIGGER ALL
,它将锁定表并重新检查所有数据(重新)验证它。
FK约束是唯一可以"舒适" "禁用/启用"通过param
然后启用它们。
但总之,上述程序与Postgres处理约束的方式有很大的不同,我怀疑你在这里会有多大成功。可能你必须保存所有现有约束的定义,删除它们并从已保存的定义重新创建到"启用" ...