1

所以,我认为这应该相当简单,但文档使它看起来有点复杂。我在 PostgreSQL(目前是 8.1)中编写了一个 SQL 函数,它对一些字符串输入进行了一些清理。值得一提的是,该字符串是一个 LDAP 专有名称,我希望逗号后始终没有空格 - 函数是 clean_dn(),它返回清理后的 DN。我想做同样的事情来强制对另一对列的所有输入为小写,等等——一旦我弄清楚这部分,这应该很容易。

无论如何,只要有人尝试插入或更新和修改该列,我希望此函数在表的“dn”列上运行。但是我能找到的所有规则示例似乎都假设所有插入/更新查询都会一直修改表中的所有列。在我的情况下,情况并非如此。我认为我真正想要的是一个仅更改值而不是返回 true 或 false 的约束,但这对于约束的 SQL 概念似乎没有意义。我是否让我的规则对新表执行更新?我是否必须为每个可能的新值组合创建一个新规则?如果我添加一个列,我是否必须检查并更新我的所有规则组合以反映每个可能的新列组合?

必须有一个简单的方法...

4

1 回答 1

0

首先,更新到当前版本的 PostgreSQL。8.1 早就死了,被遗忘了,没有得到支持,而且非常非常老了.. 你明白我的意思吗?当前版本是 PostgreSQL 9.2

然后,使用触发器而不是规则。它更简单。这是大多数人的方式。我愿意。

对于col表中的列tbl...

首先,创建一个触发函数

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;

然后在触发器中使用它。
对于古代 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 触发器...

于 2012-10-08T23:56:12.567 回答