我有触发器和规程。我想确保保存到数据库的字符串不包含'-'字符。
执行后
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()
答案 0 :(得分:1)
更新或插入的值始终被视为类型varchar(10)
-在触发函数之前和之后。因此,您无法处理该值,因为即使触发器函数将其转换为有效值,输入类型也不适合该值。
如果您的文本类型不受限制,则可以使用。在那里,您可以看到触发器已执行:
因此,处理此问题的唯一机会是在插入或更新之前对其进行标准化:
INSERT INTO interesant VALUES (normalize_nip('555-555-5555'));
UPDATE interesant SET interesant_nip = normalize_nip('555-555-5555')