Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Помогите написать триггер для PostgreSQL


Автор: Cross 14.9.2006, 15:43
Есть таблица cat_subcat. Ее структура такова:
Код
id int4
subcat_id int4
level int4

Соответственно id - это каталог, subcat_id - подкаталог, level - уровень вложенности
Параметр level должен определяться самостоятельно с помощью триггера.
(например, если subcat_id = 0, то level = 1);

как написать такой триггер?

Я сделала функцию :
Код
CREATE OR REPLACE FUNCTION moddata()
  RETURNS opaque AS
$BODY$
begin
if new.subcat_id <1 then
new.level = new.level + 1;
end if;
return new;
end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION moddata() OWNER TO postgres;

Ну и триггер, ее вызывающий. Но ничего не работает. В таблице cat_subcat не появляются значения level.

Автор: tux 15.9.2006, 06:38
Во-первых, триггерная функция должна возвращать тип trigger, а не какой не opaque. Если конечно версия PostgreSQL не старее 7.3. Хотя новые версии заменяют opaque на trigger.
Во-вторых, создать функцию - этого мало. Надо создать сам триггер. 
Код

CREATE TRIGGER mod_data BEFORE INSERT OR UPDATE ON table FOR EACH ROW EXECUTE PROCEDURE moddata();

Триггер создан или все-таки не работает сама функция? На первый взгляд в ней все нормально.

Автор: Cross 15.9.2006, 14:37
Большое спасибо, ошибка была в типе opaque. Я подставила в функцию returns trigger as $some_name$ 
Потом создала сам триггер и все заработало. А до этого триггер был тоже у меня создан, но выводил warning по поводу этого opaque!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)