powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Триггер вставки
7 сообщений из 7, страница 1 из 1
Триггер вставки
    #40060232
pirab41
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

У меня есть триггер, который после того как добавили строку в таблицу Work, должен вставлять некоторые данные из добавленной строки в таблицу Journal.
Вот изначальный код триггера (пока без условия выборки):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR ALTER TRIGGER Ins_Jornal FOR Work
AFTER INSERT
AS
DECLARE JournalID INTEGER;
BEGIN
:JournalID = (SELECT MAX(JournalID) FROM JournalFly) +1;

INSERT INTO Journal(JournalID, WorkID) values (:JournalID, New.WorkID);
END 



Но мне нужно добавить в таблицу Journal данные только в том случае, если новая строка в таблице Work имеет в столбце Ysluga=1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR ALTER TRIGGER Ins_Jornal FOR Work
AFTER INSERT
AS
DECLARE JournalID INTEGER;
BEGIN
:JournalID = (SELECT MAX(JournalID) FROM JournalFly) +1;

IF (NEW.Ysluga=1) THEN
begin
INSERT INTO Journal(JournalID, WorkID) values (:JournalID, New.WorkID);
end
END



При этом триггер вроде как срабатывает, но когда я захожу в таблицу Journal , то не вижу вставленных строк.

Пробовала использовать IN AUTONOMOUS TRANSACTION , но тогда при попытки вставки в таблицу Journal появляется сообщение, что вставляемый WorkID ещё не создан.....
Помогите пожалуйста
...
Рейтинг: 0 / 0
Триггер вставки
    #40060234
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT MAX+1 убирай, переходи на генераторы.

И названия таблиц - WORK, JOURNAL... Ты бы их еще назвал COMMIT и TABLE.
...
Рейтинг: 0 / 0
Триггер вставки
    #40060249
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pirab41
когда я захожу в таблицу Journal , то не вижу вставленных строк

А был ли commit?
...
Рейтинг: 0 / 0
Триггер вставки
    #40060251
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pirab41,

Приведите пожалуйста DDL таблиц, версию ЖП и параметры транзакции.

P.S.
Экстрасенсы в другом форуме.
...
Рейтинг: 0 / 0
Триггер вставки
    #40060252
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если JournalID это первичный ключ в таблице Journal то принципиально неправильно сделаны 2 вещи:

- получение следующего значения черех MAX()+1
- получение этого значения в триггере какой-то левой таблицы

Классикой является заполнение ID в триггере той самой таблицы, в данном случае Journal , из генератора.

Конструкция MAX()+1 работает в контексте транзакции и может не видеть созданную но незакоммиченную версию.
Генераторы работают вне транзакции, и таких проблем не создадут.

Таким образом привставке записи в Journal значение поля JournalID вообще не нужно указывать - оно подставится автоматически.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create table Journal (
  JournalID integer not null,
  WorkID    integer
);

alter table Journal add constraint Journal_PK primary key (JournalID);

create generator gen_Journal_JournalID;

SET TERM ^ ;

CREATE OR ALTER TRIGGER JOURNAL_BI FOR JOURNAL
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.JournalID is null) then
    new.JournalID = gen_id(gen_Journal_JournalID, 1);
end
^

SET TERM ; ^



Соответственно триггер на Work будет выглядеть как-то так

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE OR ALTER TRIGGER Journal_AI FOR Work
AFTER INSERT
AS
DECLARE JournalID INTEGER;
BEGIN
  IF (NEW.Ysluga=1) 
    THEN INSERT INTO Journal(WorkID) values (New.WorkID);
END




Пробовала использовать IN AUTONOMOUS TRANSACTION , но тогда при попытки вставки в таблицу Journal появляется сообщение, что вставляемый WorkID ещё не создан.....


Из приведенного вами DDL я не понял что может вызвать такое сообщение.
Сообщения лучше приводить в оригинале, а не "в пересказе Рабиновича".

И да, как тут уже говорили, невидимость записи в Journal скорее всего потому что запись незакоммичена, или читающая транзакция такого типа что ее требуется перезапустить.

В случае с получением значения JournalID из генератора - факт вставки записи (косвенно, конечно) можно проверить глянув на текущее значение генератора. Генератор виден без транзакций - если значение поменялось, значит его дергали. Если место где его дергают - только в триггере Journal_AI - значит вставка в журнал была.
...
Рейтинг: 0 / 0
Триггер вставки
    #40060271
pirab41
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraks,
Спасибо большое за помощь!
Разобрался
...
Рейтинг: 0 / 0
Триггер вставки
    #40060278
Dimbuch®
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pirab41,

Тут правильно пишут, что вместо MAX+1 надо использовать генератор.
Но, если уж используется, то надо учитывать, что записей в таблице JournalFly может не быть, тогда будет ошибка

Надо так:
Код: sql
1.
:JournalID = COALESCE((SELECT MAX(JournalID) FROM JournalFly), 0) +1;



MAX - это не COUNT. При пустом наборе он возвращает NULL
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Триггер вставки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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