【发布时间】: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