カスタマイズされたオプション 適切に:
-
オプションはまだ設定されていません
それへのすべての言及は例外を引き起こします 、
current_setting()
2番目のパラメータmissing_ok
で呼び出されない限り 。 マニュアル: -
有効な整数リテラルに設定されたオプション
-
オプションが無効な整数リテラルに設定されています
-
オプションのリセット(3の特殊なケースにバーンダウンします。 )
たとえば、
SET LOCAL
でカスタマイズされたオプションを設定した場合 またはset_config('myvars.user_id3', '55', true)
、オプション値はトランザクションの終了時にリセットされます。それはまだ存在します 、参照できますが、空の文字列を返すようになりました(''
)-integer
にキャストできません 。
デモの明らかな間違いはさておき、4つのケースすべてに備える必要があります。だから:
CREATE OR REPLACE FUNCTION add_transition1()
RETURNS trigger AS
$func$
DECLARE
_user_id text := current_setting('myvars.user_id', true); -- see 1.
BEGIN
IF _user_id ~ '^\d+$' THEN -- one or more digits?
INSERT INTO transitions1 (user_id, house_id)
VALUES (_user_id::int, NEW.id); -- valid int, cast is safe
ELSE
INSERT INTO transitions1 (user_id, house_id)
VALUES (NULL, NEW.id); -- use NULL instead
RAISE WARNING 'Invalid user_id % for house_id % was reset to NULL!'
, quote_literal(_user_id), NEW.id; -- optional
END IF;
RETURN NULL; -- OK for AFTER trigger
END
$func$ LANGUAGE plpgsql;
db <> fiddle こちら
注:
-
列名と一致する変数名は避けてください。非常にエラーが発生しやすい。一般的な命名規則の1つは、変数名の前にアンダースコアを付けることです:
_user_id
。 -
宣言時に割り当てて、1つの割り当てを保存します。データ型
text
に注意してください 。無効な入力を整理した後、後でキャストします。 -
可能であれば例外を発生させたりトラップしたりしないでください。 。 マニュアル:
-
有効な整数文字列をテストします。この単純な正規表現では、数字のみが許可されます(先頭記号、空白なし):
_user_id ~ '^\d+$'
。無効な入力がある場合はNULLにリセットします。ニーズに適応します。 -
オプションの
WARNING
を追加しました デバッグの便宜のために。 -
ケース
3.
および4.
カスタマイズされたオプションが文字列リテラル(タイプtext
)であるためにのみ発生します )、有効なデータ型を自動的に適用することはできません。
関連:
それはさておき、正確な要件によっては、カスタマイズされたオプションなしで実行しようとしていることに対して、より洗練されたソリューションがある場合があります。多分これ: