2017-07-10 86 views
0

我試着去下一個功能遷移到PostgreSQL的:遷移PLSQL功能pgplsql(PostgreSQL的9.5)

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; 

我知道,我可以切換ALL_CONSTRAINTS與information_schema.table_constraints但我怎麼可以改變的其他部分代碼?我不能禁用和啓用postgresql中的約束,我不想把它們放在這部分。我讀到,我可以改變檢查約束(哪些是我有的唯一類型的約束)沒有驗證,但我沒有找到谷歌上的任何例子。請幫忙,謝謝。

+0

使用format()函數。這至少可以解決報價問題。 – wildplasser

回答

1

您可以在ADD CONSTRAINT上設置NO VALID檢查約束的標記,因此如果不先丟棄舊的CHECK CONSTRAINT,則無法執行此操作。因此,這裏的「ENABLE」將是ALTER TABLE ...VALIDATE,它將鎖定表格並遍歷所有數據(重新)驗證它。

FK限制是您可以通過ALTER TABLE ... DISABLE TRIGGER ALL「舒適」「禁用/啓用」然後啓用它們的唯一類型。

但總之上述過程與Postgres處理約束的方式有很大不同,我懷疑你在這裏會取得多大成功。可能您必須保存所有現有約束的定義,放下它們並從保存的定義重新創建以「啓用」...

+0

是否有任何postgresql函數獲取作爲參數的一個對象(例如約束),並讓您回到用於它的創建命令? – Mariel

+0

任何類型 - 沒有。約束可以部分DDL'ed'''從pg_constraint選擇pg_get_constraintdef(oid),其中conname ='b_i_fkey';''' –