Postgres正则表达式在触发器中匹配不正确

时间:2017-09-15 16:54:08

标签: regex postgresql rspec-rails

我有一个带有正则表达式检查的INSERT触发器,它没有返回我的预期结果...但是当在触发器中运行时只有 。从我的SQL编辑器运行时,它按预期工作。

失败的触发器代码(我添加了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;

这是抛出的异常(我希望tf):

 # --- Caused by: ---
 # PG::RaiseException:
 #   ERROR:  postal_code regex check t

如果我直接在我的SQL编辑器中运行它:

select '55555' !~* '^\d{5}$';

按预期返回false

Postgres 9.6

更新:我尝试隔离此问题,但无法使用以下内容进行重现(如果显示问题,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;

1 个答案:

答案 0 :(得分: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}$'