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

标签 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;

最佳答案

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;

关于postgresql - 使用postgresql中的触发器函数获取表中的所有列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19225498/

相关文章:

sql - postgres : id auto-increment with millions of rows per day. 坏了吗?

ruby-on-rails-3 - 找到最接近整数的最有效方法?

sql - PostgreSQL - 使用函数命名选择查询中的列

sql - PostgreSQL - 更改数字精度?

Postgresql通用触发器函数?

SQL 触发器信息

postgresql - 临时表不是已知变量

postgresql - pg_dump 转储具有紧凑约束的表模式

postgresql jsonb 在对象中查找键

postgresql - 我可以将 postgresql/base 目录复制为数据库备份吗?