2017-01-28 47 views
1

私は自分のテーブルから列の 'data_type'を返すトリガーをユーザーにしようとしています。 SQL FIDDLEは全体のトリガを持っている...しかし、KETビットは以下のとおりです。エラー:リレーションの "data_type"列が存在しません

FOR each_column IN 
     SELECT 
      attname as column_name, 
      format_type(atttypid, atttypmod) AS data_type 
     FROM 
      pg_attribute 
     WHERE 
      attrelid = 
      (
       SELECT 
        oid 
       FROM 
        pg_class 
       WHERE 
        relname = tg_relname 
      LIMIT 1) 
     AND attnum > 0 
    LOOP 

私は(このクエリの末尾にある)取得していますエラー:

ERROR: column "data_type" of relation does not exist Where: PL/pgSQL function log.insert_history() line 94 at SQL statement 

は、私が何を私はよく分かりません誰かがそれを見ますか?

+0

完全なコードを表示 –

+1

'create table log.history ...'文に 'data_type'列はありません。後でデータを挿入しようとしています: 'INSERT INTO log.history(...、column_name、data_type、new_val、...)' – Abelisto

+0

@Abelisto - 正しい。分かった。私は以下の答えで更新しました。ありがとう! – user14696

答えて

1

あなたは、テーブルYOUR_SCHEMA.YOUR_TABLE_NAMEからすべての列を取得するには、以下のSQLを使用することができます。

SELECT 
    a.attname, LOWER(format_type(a.atttypid, a.atttypmod)) AS type, d.adsrc, 
    a.attnotnull, a.atthasdef 
FROM 
    pg_attribute a 
     LEFT JOIN pg_attrdef d ON (a.attrelid = d.adrelid AND a.attnum = d.adnum) 
WHERE 
    a.attnum > 0 AND NOT a.attisdropped 
    AND a.attrelid = (SELECT oid FROM pg_catalog.pg_class WHERE relname = 'YOUR_TABLE_NAME' 
     AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = 'YOUR_SCHEMA')) 
ORDER BY 
    a.attnum; 
+0

ところで、このようなクエリを簡略化することができるトリックがあります。たとえば、次のようになります。 'select * from pg_attribute where attrelid = 'information_schema.columns' :: regclass;' – Abelisto

0

@Abelistoは正しかった - 私は「テーブルを作成」​​に文を追加するのを忘れ。おっとっと!

SQL FIDDLE is HEREの作業用解決策。

関連する問題