首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PostgreSQL中注册触发器?

如何在PostgreSQL中注册触发器?
EN

Stack Overflow用户
提问于 2019-09-16 10:18:16
回答 1查看 168关注 0票数 1

我有扳机和程序。我希望确保保存到数据库中的字符串没有“-”字符。

执行后

代码语言:javascript
复制
UPDATE interesant SET interesant_nip = '555-555-5555' 

我搞错了

值对于varchar(10)来说太长了。

这表明“-”字符在insert-update之前没有删除。

为什么我的扳机没被执行?

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-16 10:31:02

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

如果您有一个无界的文本类型,它就能工作。在这里您可以看到触发器是执行的:

demo:db<>fiddle

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

demo:db<>fiddle

代码语言:javascript
复制
INSERT INTO interesant VALUES (normalize_nip('555-555-5555'));

UPDATE interesant SET interesant_nip = normalize_nip('555-555-5555') 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57954768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档