使用postgresql中的触发器函数获取表中的所有列名称

时间:2013-10-07 12:55:12

标签: postgresql postgresql-9.2

如何在触发器函数中获取所有列名及其值,因为我需要在插入表之前验证所有列值。我尝试过以下代码。如果我们知道列名意味着我们可以轻松获取值在触发器函数中使用NEW对象作为NEW.myColumnName。但在这里我需要动态获取列名...

    CREATE FUNCTION insert_update_validate() RETURNS TRIGGER AS $$
    DECLARE
    BEGIN
    FOR i IN 0..(TG_ARGV-1) LOOP
         IF TG_ARGV[i] IS NULL THEN                 
               RAISE EXCEPTION 'cannot have null VALUE', NEW.TG_ARGV[i];
    END LOOP;
    RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;

1 个答案:

答案 0 :(得分:2)

由于hstore是PostgreSQL的一部分,因此将行转换为hstore是迭代其列的主要方法,至少在plpgsql上下文中是这样。否则作为一种语言,它不提供任何构造来从行中提取列名。

基本上是关于迭代each(store(NEW))。这是你可以使用的骨架:

CREATE FUNCTION insert_update_validate() RETURNS TRIGGER AS $$
DECLARE
 k text;
 v text;
BEGIN
  FOR k,v IN select key,value from each(hstore(NEW)) LOOP
    if v is null then
      raise exception 'value is null for column %', k;
    end if;
  END LOOP;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;