1

我有触发器和程序。我想确保保存到数据库的字符串没有“-”字符。

执行后

UPDATE interesant SET interesant_nip = '555-555-5555' 

我收到错误

varchar(10) 的值太长。

这表明在插入更新之前没有删除“-”字符。

为什么我的触发器没有被执行?

CREATE FUNCTION normalize_nip() RETURNS TRIGGER AS $$
BEGIN
    -- replace '' to NULL
    IF (NEW.interesant_nip LIKE '') THEN
        NEW.interesant_nip := NULL;
        RETURN NEW;
    END IF;

    -- remove '-' from string
    NEW.interesant_nip := REPLACE(NEW.interesant_nip, '-', '');

    RETURN NEW;
END; $$ LANGUAGE plpgsql;"

CREATE TRIGGER interesant_nip_normalize BEFORE INSERT OR UPDATE ON public.interesant FOR EACH ROW EXECUTE PROCEDURE normalize_nip()
4

1 回答 1

1

更新或插入的值始终被视为类型varchar(10)- 在触发函数之前和之后。因此,您无法处理该值,因为即使触发函数将其转换为有效值,输入类型也不适合该值。

如果您有无限的文本类型,它会起作用。在那里你可以看到触发器被执行:

演示:db<>小提琴


因此,处理此问题的唯一机会是在插入或更新之前对其进行规范化:

演示:db<>小提琴

INSERT INTO interesant VALUES (normalize_nip('555-555-5555'));

UPDATE interesant SET interesant_nip = normalize_nip('555-555-5555') 
于 2019-09-16T10:31:02.253 回答