PostgreSQL триггер на UPDATE

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
armadex
мл. сержант
Сообщения: 111
Зарегистрирован: 2007-11-07 21:29:33
Откуда: Ukraine, Кривой Рог
Контактная информация:

PostgreSQL триггер на UPDATE

Непрочитанное сообщение armadex » 2010-08-17 16:53:26

есть 2 таблицы,

Код: Выделить всё

CREATE TABLE actions (
    username character varying(64) DEFAULT ''::character varying NOT NULL,
    uid bigint DEFAULT 0::bigint NOT NULL,
    in_bytes bigint DEFAULT 0::bigint NOT NULL,
    out_bytes bigint DEFAULT 0::bigint NOT NULL
);

CREATE TABLE graph_data (
    graph_id bigserial NOT NULL,
    id_user bigint DEFAULT 0::bigint NOT NULL,
    new_in_bytes bigint DEFAULT 0::bigint NOT NULL,
    new_out_bytes bigint DEFAULT 0::bigint NOT NULL
);
в таблице actions каждые 5 минут обновляются значения in_bytes, out_bytes, помогите создать триггер который при обновлении полей in_bytes, out_bytes, будет вставлять в таблицу graph_data в колонки new_in_bytes, new_out_bytes значения НОВЫЙ.in_bytes - СТАРЫЙ.in_bytes, и так же для out_bytes!

Получилось нечто вроде

Код: Выделить всё

CREATE OR REPLACE FUNCTION OnActionsUpdate() RETURNS TRIGGER AS $$
BEGIN
    IF NEW.in_bytes!=OLD.in_bytes or NEW.out_bytes!=OLD.out_bytes THEN
        INSERT INTO graph_data(id_user,new_in_bytes,new_out_bytes) VALUES(NEW.uid, NEW.in_bytes-OLD.in_bytes, NEW.out_bytes-OLD.out_bytes);
    END IF;
    RETURN NULL;
END;$$ LANGUAGE plpgsql SECURITY DEFINER;

CREATE TRIGGER trigger_OnActionsUpdate AFTER UPDATE ON actions FOR EACH ROW EXECUTE PROCEDURE OnActionsUpdate();
но после апдейта таблицы actions в graph_data все равно ничего не INSERTится, в какую сторону копать?
Автор благодарит алфавит за любезно предоставленные буквы!

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
armadex
мл. сержант
Сообщения: 111
Зарегистрирован: 2007-11-07 21:29:33
Откуда: Ukraine, Кривой Рог
Контактная информация:

Re: PostgreSQL триггер на UPDATE

Непрочитанное сообщение armadex » 2010-09-24 12:14:34

короче кому интересно, тоже самое можно сделать с помощью RULE

Код: Выделить всё

CREATE RULE "_RETURN" AS
    ON UPDATE TO actions DO INSTEAD 
    INSERT INTO graph_data (id_user, new_in_bytes, new_out_bytes) VALUES(OLD.uid, NEW.in_bytes-OLD.in_bytes, NEW.out_bytes-OLD.out_bytes);
Автор благодарит алфавит за любезно предоставленные буквы!

Аватара пользователя
armadex
мл. сержант
Сообщения: 111
Зарегистрирован: 2007-11-07 21:29:33
Откуда: Ukraine, Кривой Рог
Контактная информация:

Re: PostgreSQL триггер на UPDATE

Непрочитанное сообщение armadex » 2010-09-24 12:22:17

тупонул, вместо INSTEAD, ALSO
Автор благодарит алфавит за любезно предоставленные буквы!

Charlz_Klug_
проходил мимо

Re: PostgreSQL триггер на UPDATE

Непрочитанное сообщение Charlz_Klug_ » 2010-09-24 13:15:20

Не прошло и полгода)) Но, лучше поздно, чем никогда.

Аватара пользователя
armadex
мл. сержант
Сообщения: 111
Зарегистрирован: 2007-11-07 21:29:33
Откуда: Ukraine, Кривой Рог
Контактная информация:

Re: PostgreSQL триггер на UPDATE

Непрочитанное сообщение armadex » 2010-09-24 14:42:00

а где же вы такой умный, были пол года назад? ))))
Автор благодарит алфавит за любезно предоставленные буквы!