powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / trigger before insert or update
9 сообщений из 9, страница 1 из 1
trigger before insert or update
    #33115666
вобщем, есть таблица с информацией о телефонных номерах:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE phonestat (
    phone_id serial NOT NULL,
    numb character varying( 6 ) NOT NULL,
    begin_action date DEFAULT ('now'::text)::date NOT NULL,
    end_action date, -- DEFAULT NULL
    subscr_id integer DEFAULT  0  NOT NULL,
    subscr_type_id integer DEFAULT  6  NOT NULL,
    ........
    inuse boolean DEFAULT true NOT NULL
);
ALTER TABLE ONLY phonestat
    ADD CONSTRAINT phonestat_numb_key UNIQUE (numb, begin_action, end_action);
ALTER TABLE ONLY phonestat
    ADD CONSTRAINT phonestat_pkey PRIMARY KEY (phone_id);
numb - номер телефона,
owner - владелец номера,
begin_action .. end_action - период, в котором данный номер принадлежал данному владельцу.
если begin_action установлен, а end_action - NULL, номер принадлежит владельцу в настоящее время.
Собственно проблема:
как с помощью триггера (или другим способом) сделать так, чтобы при добавлении новой информации о номере, либо изменении информации о номере:
1. если такой номер есть и он принадлежит кому-то в настоящее время (end_action=NULL) - изменить end_action на (сегодня - 1 день) и вставить новую запись с end_action=NULL;
2. Если информации о номере нет, то вставить его (даже если происходит UPDATE)
Заранее спасибо.
...
Рейтинг: 0 / 0
trigger before insert or update
    #33115931
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://www.postgresql.org/docs/8.0/interactive/plpgsql-trigger.html

это постгрес 8 если у вас другой просто смотрите документацию на ту версию которая вас интересует
...
Рейтинг: 0 / 0
trigger before insert or update
    #33116230
drew0-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так он и в 1 и во 2 случае вставляется в таблицу как я понял...
брр.. и при изменении вставлять строку... тогда не понял.
ну ладно. вот пример - разбирайся дапльше сам че там придумал =))

Код: plaintext
CREATE TRIGGER upd_numb AFTER INSERT OR UPDATE ON phonestat FOR EACH ROW EXECUTE PROCEDURE upd_numb();

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE FUNCTION upd_numb()
  RETURNS "trigger" AS
$BODY$
    BEGIN
        IF (SELECT COUNT(*) FROM phonestat WHERE numb=NEW.numb AND end_action=NULL) >  0  THEN
            UPDATE phonestat SET end_action=now() WHERE numb=NEW.numb AND end_action=NULL;
            INSERT INTO phonestat (numb, end_action) VALUES (NEW.numb, NULL);
        END IF;
        RETURN NEW;
    END;
$BODY$

ну вроде так... хотя заморочки с инсертом новой строки при апдейте не ясны...
если ты просто вставляешь строку - то у тебя уже 2 одинаковых получается, а если апдейтишь - то уже 3. короче я не понял...
...
Рейтинг: 0 / 0
trigger before insert or update
    #33116239
drew0-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а или если инсерт новой строки по-любому, тогда это вне условия

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE OR REPLACE FUNCTION upd_numb()
  RETURNS "trigger" AS
$BODY$
    BEGIN
        IF (SELECT COUNT(*) FROM phonestat WHERE numb=NEW.numb AND end_action=NULL) >  0  THEN
            UPDATE phonestat SET end_action=now() WHERE numb=NEW.numb AND end_action=NULL;
        END IF;
        INSERT INTO phonestat (numb, end_action) VALUES (NEW.numb, NULL);
        RETURN NEW;
    END;
$BODY$
...
Рейтинг: 0 / 0
trigger before insert or update
    #33116315
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2drew0
и не лень тебе за других проблемы решать? в доке ж все есть с примерами и в красках ...
...
Рейтинг: 0 / 0
trigger before insert or update
    #33118749
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Андрей Агеев
Drew0- прав (во втором случае), как я понимаю, только наверно все-таки RETURN NULL -
чтобы вместо апдейта инсерт случился.
Но у меня есть несколько замечаний. Я решаю похожую задачу и думаю, что
1. оператора необходимо уведомить, если такой номер уже есть.
2. часто при этом смена владельца происходит не сегодня, а в ближайшем будующем,
(перезаключение договора, как я понимаю)
3. а иногда в недалеком прошлом.
Из всего получается, что лучше соответствующее изменение вынести из триггера и отдать
под контроль клиента (например, через процедуры сохраненные).
Мне так кажется.
...
Рейтинг: 0 / 0
trigger before insert or update
    #33119790
вкуц0-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vfabr2drew0
и не лень тебе за других проблемы решать? в доке ж все есть с примерами и в красках ...
я полтора месяца назад задавал здесь вопрос про триггер . примерно такой же. слабо представляя как это вообще работает. мне помогли (ну там за исключением одного товарища). да и ты мне несколько раз очень помогал дельными советами. так почему бы не продолжить это добрую традицию помощи новичкам? в хелпе все, конечно, есть - согласен...
...
Рейтинг: 0 / 0
trigger before insert or update
    #33119795
drew0-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это я был. косяк с раскладкой вышел =)
...
Рейтинг: 0 / 0
trigger before insert or update
    #33122187
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
офф топ

создавшему топик был дан ответ на его вопрос в виде ссылки (тебе кстати тоже первый полезный ответ был дан в виде ссылки ;-))

спросивший ясно представлял что он хочет получить, но не представлял как это реализовать. лучше и точнее чем написано в мане я вряд ли смог разьяснить ...

ИМНО
человек поковырявшись пару часов получит значительно больший багаж знаний чем если он получит готовое решение своей задачи и хорошо если решение окажется корректным
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / trigger before insert or update
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]