2017-09-15 20 views
1

私の予想される結果を返さない正規表現チェックを持つ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; 
+0

私は別の質問があります、なぜそれは 't'ですか? – revo

+0

t = true、f = false何かが見つからない場合 – pherris

+0

あなたは 't'が本当であることを確信していますか?またはあなたは推測する? – revo

答えて

0

問題は、正規表現からバックスラッシュを取り除くトリガーを追加したRailsの移行でした。移行中にこの構文を使用して

sql = <<-SQL 
    CREATE OR REPLACE FUNCTION validate_postal_code() RETURNS trigger 
    LANGUAGE plpgsql 
    AS $$ 
     DECLARE 

     BEGIN 
      IF NEW.postal_code !~ '^\d{5}$' THEN 
      RAISE EXCEPTION 'Debug--> postal_code regex check %, %, %', NEW.postal_code !~* '^\d{5}$', TG_OP, NEW.postal_code; 
      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(); 
SQL 

execute sql 

Railsのマイグレーションでは、私の正規表現でバックスラッシュを剥ぎ取りました。データベースに適用されていた実際の正規表現は、'^\d{5}$'の代わりに'^d{5}$'(バックスラッシュがありません)でした。