我有扳机和程序。我希望确保保存到数据库中的字符串没有“-”字符。
执行后
UPDATE interesant SET interesant_nip = '555-555-5555' 我搞错了
值对于varchar(10)来说太长了。
这表明“-”字符在insert-update之前没有删除。
为什么我的扳机没被执行?
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()发布于 2019-09-16 10:31:02
更新或插入的值始终被视为varchar(10)类型-在触发器函数之前和之后。因此,您无法处理该值,因为即使触发器函数将其转换为有效的值,输入类型也不适合该值。
如果您有一个无界的文本类型,它就能工作。在这里您可以看到触发器是执行的:
因此,处理此问题的唯一机会是,在插入或更新之前将其规范化:
INSERT INTO interesant VALUES (normalize_nip('555-555-5555'));
UPDATE interesant SET interesant_nip = normalize_nip('555-555-5555') https://stackoverflow.com/questions/57954768
复制相似问题