2010-06-21 2 views
4

У меня есть функция триггера для испытания таблицы, которая имеет следующий фрагмент кода -PostgreSQL: Можно ли динамически петли через колонку за столом в

IF TG_OP='UPDATE' THEN 
    IF OLD.locked > 0 AND 
(  OLD.org_id <> NEW.org_id OR 
      OLD.document_code <> NEW.document_code OR 
      -- Other columns 
      .......................... 
) 
THEN 
    RAISE EXCEPTION 'Message'; 
/* Rest of the codes */ 
................................. 

Поэтому я статически проверки все новое значение столбца с его предыдущее значение для обеспечения целостности. Теперь каждый раз, когда меняется моя бизнес-логика, и я должен добавлять новые столбцы в эту таблицу, мне придется каждый раз изменять этот триггер. Я подумал, что было бы лучше, если бы я мог динамически проверять все столбцы этой таблицы, явно не набрав их имя.

Как это сделать?

ответ

6

Посмотрите на information_schema, есть вид «столбцы». Выполнить запрос, чтобы получить все текущее columnnames из таблицы, обожженной курок:

SELECT 
    column_name 
FROM 
    information_schema.columns 
WHERE 
    table_schema = TG_TABLE_SCHEMA 
AND 
    table_name = TG_TABLE_NAME; 

Loop через результат, и там вы идете!

Дополнительную информацию можно найти в fine manual.

8

С 9.0 beta2 документации о WHEN пункте в триггерах, которые могли бы быть использованы в более ранних версиях в теле триггера:

OLD.* IS DISTINCT FROM NEW.*

или, возможно (from 8.2 release notes)

IF row(new.*) IS DISTINCT FROM row(old.*)

+0

Да. Если все, что вы делаете, проверяет, изменились ли значения столбцов, и вам не нужно знать конкретные столбцы (столбцы), которые были изменены, второй фрагмент Стивена - это, безусловно, путь. Краткий и никогда не нуждается в техническом обслуживании! –

+0

Архангел может сочтет полезным объединить этот тест со знанием того, был ли «заблокирован» 0 «и изменен ли« заблокирован ». Кроме того, 'IS DISTINCT FROM' имеет дело с нулями менее удивительным образом, чем' <> ' –

1

Используйте pl/perl или pl/python. Они намного лучше подходят для таких задач. много лучше.

Вы также можете установить hstore-new и использовать его семантику row-> hstore, но это определенно не очень хорошая идея при использовании обычных типов данных.