2017-01-28 3 views
1

Я пытаюсь вызвать триггер для возврата «data_type» столбца из моей таблицы. SQL FIDDLE имеет весь спусковой крючок ... но кеты биты:Ошибка: столбец «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 

Я не уверен, что я 'm missing ... кто-нибудь это видит?

+0

Показать полный код –

+1

В инструкции 'create table log.history ...' нет столбца' data_type'. Позже вы пытаетесь вставить в него данные: 'INSERT INTO log.history (..., column_name, data_type, new_val, ...)' – Abelisto

+0

@Abelisto - правильно. Вижу. Я обновил свой ответ ниже. Благодаря! – user14696

ответ

1

Вы можете использовать SQL ниже, чтобы получить все столбцы из таблицы YOUR_SCHEMA.YOUR_TABLE_NAME:

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

BTW есть трюк, который позволяет упростить такие запросы, например: 'select * from pg_attribute, где attrelid = 'information_schema.columns' :: regclass;' – Abelisto

0

@Abelisto было правильно - я забыл добавить заявление в «создать таблицу». К сожалению!

Рабочее решение в SQL FIDDLE is HERE.

Смежные вопросы