清理postgres中列的输入

时间:2012-10-08 22:46:10

标签: postgresql validation plpgsql sanitization postgresql-8.1

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

无论如何,我希望任何人试图插入或更新和修改该列时,都可以在表的“dn”列上运行此函数。但我能找到的所有规则示例似乎都假设所有插入/更新查询始终修改表中的所有列。在我的情况下,情况并非如此。我认为我真正想要的是一个约束,它只是改变值而不是返回true或false,但这似乎与约束的SQL思想没有关系。我的规则是否对NEW表进行了更新?我是否必须为每个可能的NEW值组合创建新规则?如果我添加一个列,是否必须通过并更新所有规则组合以重新选择每个可能的新列组合?

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

1 个答案:

答案 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触发器......