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;
4

1 に答える 1

2

は PostgreSQL の一部であるためhstore、行を 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;
于 2013-10-07T15:59:20.187 に答える