powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / BEFORE Insert триггер
4 сообщений из 4, страница 1 из 1
BEFORE Insert триггер
    #34538516
Etander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый всем вечер!

У меня есть 2 таблицы:

Table "ContrAgents" (
caId serial,
type int4
);

Table "Hotel" (
hotelId serial,
caId int4
);

"Hotel".caId ссылается на "ContrAgents".caId (foreign key). Мне нужно сделать следующее: при добавлении записи в таблицу "Hotel" сначала добавляется запись в таблицу "ContrAgents" (иначе нельзя: целостность нарушается), а затем уже происходит вставка записи в "Hotel".

Помогите, пожалуйста, написать триггер для выполнения этих действий.
...
Рейтинг: 0 / 0
BEFORE Insert триггер
    #34540513
madvet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может сначала подумать, а нужно ли это?
...
Рейтинг: 0 / 0
BEFORE Insert триггер
    #34540597
Etander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да нужно, в общем-то. Таблица "ContrAgents" служебная, поэтому хранимая процедура не очень хорошо подходит: пользователь должен выполнять обычный Insert вместо запуска хранимой процедуры.

В общем, решение я уже нашел (во многом, методом "тыка") :) Выглядит оно до безобразия просто:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create function HotelInsert() returns trigger as
	$$
	BEGIN
		insert into "ContrAgents"(caType) values ( 1 );
		NEW.caId = currval('"ContrAgents_caid_seq"');
		return NEW;
	END;
	$$ LANGUAGE 'plpgsql';

CREATE TRIGGER ttr BEFORE INSERT on "Hotel" for each row execute procedure HotelInsert();

...
Рейтинг: 0 / 0
BEFORE Insert триггер
    #34540903
.gc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
.gc
Гость
EtanderДа нужно, в общем-то. Таблица "ContrAgents" служебная, поэтому хранимая процедура не очень хорошо подходит: пользователь должен выполнять обычный Insert вместо запуска хранимой процедуры.

В общем, решение я уже нашел (во многом, методом "тыка") :) Выглядит оно до безобразия просто:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create function HotelInsert() returns trigger as
	$$
	BEGIN
		insert into "ContrAgents"(caType) values ( 1 );
		NEW.caId = currval('"ContrAgents_caid_seq"');
		return NEW;
	END;
	$$ LANGUAGE 'plpgsql';

CREATE TRIGGER ttr BEFORE INSERT on "Hotel" for each row execute procedure HotelInsert();


выбросите это -- а если при вставке в "Hotel" используется уже существующее значение caId?
да, есть ещё RULES:
http://developer.postgresql.org/docs/postgres/rule-system.html
и DEFERRABLE CONSTRAINTS:
http://developer.postgresql.org/docs/postgres/sql-createtable.html

также рекомендую узнать, что такое nextval() :)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / BEFORE Insert триггер
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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