2017-11-09 1 views
0

他のテーブルのいくつかのIDに基づいて、ポストグルのテーブルにチェック制約を作成しようとしています。私はあなたがチェックで選択して直接行うことはできません知っているしかし、私は変数にIDを取得し、チェックでそれらを使用することは可能だろうと思ったが、どちらも動作していないようです。これは私が持っているものです。postgresのチェックで宣言された変数を使用することはできますか?

DO $$ 
DECLARE 
    assigned uuid := (select "WorkOrderStatusCodeId" from "WorkOrdersV2"."WorkOrderStatusCodes" where "Code" = 'A'); 
    onHold uuid := (select "WorkOrderStatusCodeId" from "WorkOrdersV2"."WorkOrderStatusCodes" where "Code" = 'O'); 
BEGIN 
    ALTER TABLE "WorkOrdersV2"."WorkOrders" ADD CHECK (("WorkOrderStatusCodeId" not in (assigned, onHold) and "DisplayOrder" is null) or ("WorkOrderStatusCodeId" in (assigned, onHold) and "DisplayOrder" is not null)); 
END $$; 

それは私にエラーを与えている:ERROR: column "assigned" does not exist

はチェック制約でこれを行う方法はありますか私はトリガを使用する必要がありますか?

+1

を:実行割り当てられ|| 'ALTER TABLE "WorkOrdersV2を" "WorkOrdersは" CHECKを追加((ではない(中に "WorkOrderStatusCodeId"' || ( '||割り当てられた||'、 '|| onHold ||')、および "DisplayOrder"はnullではありません)); ' @AbdelP。 –

+0

あなたは正しいと思いますが、割り当てられたとonHoldのまわりに単一引用符がありません。これを答えて引用符を追加して回答としてマークします – GBreen12

+0

試したが、一重引用符で囲まれた変数の値を取ることはありません –

答えて

1

あなたは、動的SQLを使用する必要があります。あなたはすなわち動のSQLを使用する必要があります

execute 'ALTER TABLE "WorkOrdersV2"."WorkOrders" ADD CHECK (("WorkOrderStatusCodeId" not in (''' || assigned || ''',''' || onHold || ''') and "DisplayOrder" is null) or ("WorkOrderStatusCodeId" in (''' ||assigned || ''', ''' || onHold || ''') and "DisplayOrder" is not null));' 
関連する問題