私の予想される結果を返さない正規表現チェックを持つINSERTトリガーがありますが、のみトリガーで実行するとです。私のSQLエディタから実行すると、期待どおりに動作します。トリガーでPostgresの正規表現が正しく一致しません
(私は問題を解決するためにRAISE
を追加し、私は仕事に取得しようとしていたコードは以下のIF
文です)トリガコードを失敗:
RAISE EXCEPTION 'postal_code regex check %', '55555' !~* '^\d{5}$';
IF NEW.postal_code !~* '^\d{5}$' THEN
errors := ARRAY_APPEND(errors, 'Postal code format is invalid.');
END IF;
これがスローされる例外です(私はt
を期待します)f
を可能にする:
# --- Caused by: ---
# PG::RaiseException:
# ERROR: postal_code regex check t
私はちょうど私の直接SQLエディタでこれを実行する場合:
select '55555' !~* '^\d{5}$';
期待通りにfalse
を返します。
のPostgres 9.6
UPDATE:私は(これは問題を示した場合、select count(*)
は0を返すべきであるが、それは1を返す)は、この問題を特定しようとしたが、以下で再現することができませんでした:
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table (
postal_code varchar
);
CREATE OR REPLACE FUNCTION validate_postal_code() RETURNS trigger
LANGUAGE plpgsql
AS $_$
DECLARE
BEGIN
IF NEW.postal_code !~* '^\d{5}$' THEN
RETURN false;
END IF;
RETURN NEW;
END;
$_$;
DROP TRIGGER IF EXISTS validate_postal_code_trigger on my_table;
CREATE TRIGGER validate_postal_code_trigger BEFORE INSERT ON my_table FOR EACH ROW EXECUTE PROCEDURE validate_postal_code();
insert into my_table values ('55555');
select count(*) from my_table;
私は別の質問があります、なぜそれは 't'ですか? – revo
t = true、f = false何かが見つからない場合 – pherris
あなたは 't'が本当であることを確信していますか?またはあなたは推測する? – revo