如何在PostgreSQL中注册触发器?

如何在PostgreSQL中注册触发器?,sql,postgresql,postgresql-triggers,Sql,Postgresql,Postgresql Triggers,我有触发器和程序。我希望确保保存到数据库中的字符串不包含“-”字符 执行后 UPDATE interesant SET interesant_nip = '555-555-5555' 我犯了一个错误 值对于varchar(10)太长 这表明在插入更新之前没有删除“-”字符 为什么我的扳机没有被执行 CREATE FUNCTION normalize_nip() RETURNS TRIGGER AS $$ BEGIN -- replace '' to NULL IF (NEW.

我有触发器和程序。我希望确保保存到数据库中的字符串不包含“-”字符

执行后

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()

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

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


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


@Lucas'after'太晚了,保存的值对于该字段来说太大了。非常奇怪的是,在事件之前执行大小检查。所有数据库都是这样工作的?不是大小,而是类型。让我们假设另一个例子:您有一个int列。在插入之前,您始终希望添加+10。因此触发器接受输入并进行加法。但突然间,您输入了一个文本值“abc”。这不起作用,因为触发器假定为整数值。它也会失败。这是完全相同的情况,因为'555-555-5555'与varchar(10)是不同的类型。
INSERT INTO interesant VALUES (normalize_nip('555-555-5555'));

UPDATE interesant SET interesant_nip = normalize_nip('555-555-5555')