所以,我认为这应该相当简单,但文档使它看起来有点复杂。我在PostgreSQL(现在是8.1)中编写了一个SQL函数,它对某些字符串输入进行了一些清理。对于它的价值,字符串是LDAP专有名称,我希望在逗号后一直没有空格 - 而且函数是clean_dn(),它返回已清理的DN。我想做同样的事情来强制所有输入到另外几列到小写等 - 一旦我把这个部分弄清楚应该很容易。
无论如何,我希望任何人试图插入或更新和修改该列时,都可以在表的“dn”列上运行此函数。但我能找到的所有规则示例似乎都假设所有插入/更新查询始终修改表中的所有列。在我的情况下,情况并非如此。我认为我真正想要的是一个约束,它只是改变值而不是返回true或false,但这似乎与约束的SQL思想没有关系。我的规则是否对NEW表进行了更新?我是否必须为每个可能的NEW值组合创建新规则?如果我添加一个列,是否必须通过并更新所有规则组合以重新选择每个可能的新列组合?
必须有一个简单的方法......
答案 0 :(得分:1)
首先,更新到当前版本的PostgreSQL。 8.1已经死了,被遗忘了,没有得到支持,非常非常老......你明白了吗? Current version is PostgreSQL 9.2
然后,使用触发器而不是规则。它更简单。这是大多数人的方式。我做。
表col
中的列tbl
...
首先,创建一个trigger function:
CREATE OR REPLACE FUNCTION trg_tbl_insupbef()
RETURNS trigger AS
$BODY$
BEGIN
NEW.col := f_myfunc(NEW.col); -- your function here, must return matching type
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
然后在trigger中使用它 对于古代Postgres 8.1:
CREATE TRIGGER insupbef
BEFORE INSERT OR UPDATE
ON tbl
FOR EACH ROW
EXECUTE PROCEDURE trg_tbl_insupbef();
现代Postgres(9.0 +)
CREATE TRIGGER insbef
BEFORE INSERT OR UPDATE OF col -- only call trigger, if column was updated
ON tbl
FOR EACH ROW
EXECUTE PROCEDURE trg_tbl_insupbef();
你可以将更多东西打包到一个触发器中,但是你不能只在一列上调整UPDATE触发器......