![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как вставить данные одновременно в главную и подчиненную таблицы [D7, IB6.x]
Gennadiy © (2003-10-01 16:14:00)
Уважаемые мастера!!!!
Подскажите пожалуйста?
У меня есть две таблицы:
1. Таблица Employees с полями (таблица хранит данные о сотрудниках)
EMPL_ID - ключевое поле
EMPL_FIO -ФИО сотрудника
EMPL_SALARY - заработная плата сотрудника
2. Таблица STORY c полями (таблица хранит данные о истории зарплат сотрудников).
STORY_ID - ключевое поле
STORY_EMPL_IDE - ссылка на таблицу EMPLOYEES
STORYDATE-дата с новой з.п.
STORYSUMM-новая з.п.
Данные таблицы созданы на сервере INTERBASE. Так вот я не знаю
как одновременно (для пользователя) вставить данные в таблицу Story при создании новой записи в таблицe EMPLOYEES в пределах одной транзакции если значение ключевого поля в таблице EMPLOYEES (для вставки его значения в поле STORYEMPL_IDE таблицы STORY) появиттся только после Transaction.Commit????
Deniz (2003-10-02 08:40:00) [1]
>Vasya_Buterbrodov (01.10.03 18:57) [4]
>А почему, собственно, "нормальные пацаны получают значения ключей ДО вставки, а не в триггере..." ???
Чем плох вариант new.ID= gen_id(...) в триггере before_insert?
Плох только тем, что надо поменять на
if (new.id is null) then gen_id(...);
Во вторых, при добавлении записи на клиенте невозможно сделать Refresh только что вставленной записи, для возможного получения значений полей измененных тригером, например если в триггере есть запись типа:
new.update_date = Current_Date;
new.update_user = Current_User;
и т.д.
MaxDDinc (2003-10-01 21:54:00) [2]
Создай такую процедуру:
CREATE PROCEDURE PRC_INS_EMPLOYEES_STORY (
EMPL_FIO VARCHAR(16),
EMPL_SALARY VARCHAR(16),
STORYDATE VARCHAR(8),
STORYSUM VARCHAR(16)
) AS
DECLARE VARIABLE ID_NEW INTEGER;
BEGIN
ID_NEW = GEN_ID(GEN_EMPLOYEES, 1);
insert into EMPLOYEES
(EMPL_ID, EMPL_FIO, EMPL_SALARY)
values
(:ID_NEW, :EMPL_FIO, :EMPL_SALARY);
insert into STORY
(STORY_ID, STORY_EMPL_ID, STORYDATE, STORYSUMM)
values
(1, :ID_NEW, :STORYDATE, :STORYSUMM);
END
Здесь генеришь ID_NEW только для EMPLOYEES, а в STORY создай свой тригер BEFORE_INSERT
Что непонятно, спрашивай
:)
Sergey_Masloff (2003-10-01 18:58:00) [3]
Vasya_Buterbrodov [4]
читай тему обсуждения и поймешь ;-)
Vasya_Buterbrodov (2003-10-01 18:57:00) [4]
А почему, собственно, "нормальные пацаны получают значения ключей ДО вставки, а не в триггере..." ???
Чем плох вариант new.ID= gen_id(...) в триггере before_insert?
Gennadiy (2003-10-01 18:23:00) [5]
Я поле создаю с помощью триггера перед вставкой
Sergey_Masloff (2003-10-01 17:31:00) [6]
Все нормальные пацаны ;-) получают значения ключей ДО вставки записей а не в триггере во время вставки. Делай и ты также.
Андрей_ (2003-10-01 17:26:00) [7]
Каким образом Вы создаете ключевое поле?
Если с помощью генератора то его приращение происходит вне транзакции.