powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / ПОМОГИТЕ! View with Row movment и триггера
10 сообщений из 10, страница 1 из 1
ПОМОГИТЕ! View with Row movment и триггера
    #35314456
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имеется 2 идетинчных таблицы актив и архив T1 и T2
Создал view T with Row movment union all t1 и t2
на таблицах висят ограничения по дате что бы оно перемещало туды сюды при изменении даты

есть триггер before insert на t1 в котором генерится через сиквенс ID-шник для t1
и есть два триггера before update на t1 и t2 на поле статуса логического удаления
И при попытке обновить T (вьюху) запросом вида update t set EntStatus = 2
вылетает эксепшен что сломался update триггер на t1, но СООБЩЕНИЕ выдает почему то про сиквенс!!! который в другом триггере на INSERT в t1!!!
вот текст сообщения:
Код: plaintext
1.
2.
3.
An error occurred in a triggered SQL statement in trigger "DB2ADMIN.JGU1".
  Information returned for the error includes SQLCODE "-348", SQLSTATE "428F9" and
 message tokens "NEXTVAL FOR DB2ADMIN.LIVJRNACCGRP_JAGID".
 SQLCODE=- 723 , SQLSTATE= 09000 , DRIVER= 4 . 0 . 100 

в триггере на инсерт ID генерится из сиквенса примерно вот так
Код: plaintext
1.
IF (new.BaoID IS NULL) THEN 
  SET new.BaoID = NEXTVAL FOR LivBalanceAccObj_BaoID;

ЧТО делать то???
PS.
в документации на сайте нашел, что вьюхи with Row movment могут вызывать INSERT:
Строки, нарушающие проверочные ограничения после предпринятого изменения,
сначала удаляются из исходной базовой таблицы, а затем вставляются в новую таблицу
назначения при помощи INSERT с использованием семантики производной таблицы UNION ALL.

Может в этом проблема? может как то в триггере можно отследить этот неявный insert ?
...
Рейтинг: 0 / 0
ПОМОГИТЕ! View with Row movment и триггера
    #35314516
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин.... похоже надо было триггера не на таблицы лепить, а на саму view
использовать триггер ISTEAD OF...
ща проверю...
...
Рейтинг: 0 / 0
ПОМОГИТЕ! View with Row movment и триггера
    #35315810
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за фигня такая... DB2 говорит что нельзя юзать instead of trigger-а на view with row movement...
попробовть как вариант вместо row movement все замутить на триггерах что ли...
...
Рейтинг: 0 / 0
ПОМОГИТЕ! View with Row movment и триггера
    #35316112
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Напишите
- команды create trigger, в теле оставьте только команды работы с сиквенсами.
- check constraints на таблицы t1 и t2.
...
Рейтинг: 0 / 0
ПОМОГИТЕ! View with Row movment и триггера
    #35320166
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinНапишите
- команды create trigger, в теле оставьте только команды работы с сиквенсами.
- check constraints на таблицы t1 и t2.
сюда (в форум) написать текст триггеров ?
...
Рейтинг: 0 / 0
ПОМОГИТЕ! View with Row movment и триггера
    #35320313
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey Kuznetsov Mark BarinsteinНапишите
- команды create trigger, в теле оставьте только команды работы с сиквенсами.
- check constraints на таблицы t1 и t2.
сюда (в форум) написать текст триггеров ?Интересует не весь текст триггеров, а только те команды, в которых используются сиквенсы.
Дело в том, что sql0348 - это недопустимое использование сиквенса.
Вот я и хочу посмотреть, как вы этот сиквенс используете.
...
Рейтинг: 0 / 0
ПОМОГИТЕ! View with Row movment и триггера
    #35320380
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein[quot Alexey Kuznetsov][quot Mark Barinstein]Напишите
Дело в том, что sql0348 - это недопустимое использование сиквенса.
Вот я и хочу посмотреть, как вы этот сиквенс используете.

В том то и дело что вроде бы все должно работать и на инсерт все работает
но потом я делаю update и оно ломается с этим кодом 348!!!! и я в непонятках полных....
каким образом сиквенс срабатывает на update?

причем update очень простой: update LIVJRNACCGRP set JagEntStatus = 2 where (JrnSbjCode, JrnID, JagID) = (?, ?, ?)

вот констрайнты:

Код: plaintext
1.
2.
3.
4.
5.
6.
ALTER TABLE DB2ADMIN.LIVJRNACCGRP1
    ADD CONSTRAINT CHK_JAGDATE_1
    CHECK (JAGDATE >= '2007-05-01') ENFORCED ENABLE QUERY OPTIMIZATION;

ALTER TABLE DB2ADMIN.LIVJRNACCGRP2
    ADD CONSTRAINT CHK_JAGDATE_2
    CHECK (JAGDATE < '2007-05-01') ENFORCED ENABLE QUERY OPTIMIZATION;

вот триггер на insert

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE TRIGGER LivJrnAccGrp1_TI NO CASCADE BEFORE INSERT ON LivJrnAccGrp1 
REFERENCING NEW AS new FOR EACH ROW MODE DB2SQL 
BEGIN ATOMIC 
IF (NOT EXISTS(SELECT * FROM ComTrigSemaph WHERE TrfState IN ( 1 , 2 ) AND TrfTblName = 'LIVJRNACCGRP')) THEN 
 IF ((new.JagCode IN ( 200 ,  310 ,  800 )) AND 
     ((new.DiscAccSbjCode IS NULL) OR (new.DiscAccID IS NULL) OR (new.DiscAcdID IS NULL))) 
  THEN SIGNAL SQLSTATE '70221' ('Невозможно вставить операцию по льготе в журнала расчетов (код 200,310, 800) если не указан субсчет по льготе'); 
 END IF; 

 IF ((new.JagCode IN ( 200 ,  310 ,  800 )) AND
      (NOT EXISTS(SELECT AcdID FROM LivAccountDiscount b WHERE (new.DiscAccSbjCode, new.DiscAccID, new.DiscAcdID) = (b.AccSbjCode, b.AccID, b.AcdID)
        UNION SELECT AcdID FROM LivAccDiscExt c WHERE (new.DiscAccSbjCode, new.DiscAccID, new.DiscAcdID) = (c.AccSbjCode, c.AccID, c.AcdID)))) THEN 
  SIGNAL SQLSTATE '70260' ('Невозможно вставить операцию по льготе  без ссылки на  активную льготу'); 
 END IF; 

END IF; 
IF (NOT EXISTS(SELECT * FROM ComTrigSemaph WHERE TrfState =  1  AND TrfTblName = 'LIVJRNACCGRP')) THEN 
 SET new.JagTimeDateTime = CURRENT TIMESTAMP; 
END IF; 

IF (new.JagID IS NULL) THEN 
 SET new.JagID = NEXTVAL FOR LivJrnAccGrp_JagID; 
END IF;
END

вот триггеры на update, их на самом деле 4, есть еще 2 точно таких же но на архивную таблицу

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
CREATE TRIGGER LivJrnAccGrp1_TU NO CASCADE BEFORE UPDATE OF JagEntStatus ON LivJrnAccGrp1
REFERENCING NEW AS new FOR EACH ROW MODE DB2SQL 
BEGIN ATOMIC
 IF (new.JagEntStatus =  2 ) THEN
  IF (NOT EXISTS (SELECT * FROM ComTrigSemaph WHERE TrfState IN ( 1 , 2 ) AND TrfTblName = 'LIVJRNACCGRP')) THEN
   IF (EXISTS (SELECT a.JrnID FROM LivJrnCalcType a 
    WHERE (new.JrnSbjCode, new.JrnID, new.JagID,  1 ) = (a.JrnSbjCode, a.JrnID, a.JagID, a.JctEntStatus)))
   THEN SIGNAL SQLSTATE '70222' ('Невозможно удалить запись журнала расчетов верхнего уровня, если существует хотя бы одна запись на нижнем уровне по этой операции');
   END IF;

   IF (EXISTS (SELECT a.JagID FROM LivJrnAccGrp a
    WHERE (new.JrnSbjCode, new.JrnID, new.JagID,  1 ) = (a.LinkJrnSbjCode, a.LinkJrnID, a.LinkJagID, a.JagEntStatus)))
   THEN SIGNAL SQLSTATE '70223' ('Невозможно удалить запись журнала, если существует зависимые');
   END IF;
  END IF;

 IF (NOT EXISTS(SELECT * FROM ComTrigSemaph WHERE TrfState =  1  AND TrfTblName = 'LIVJRNACCGRP')) THEN
  SET new.JagTimeDateTime = CURRENT TIMESTAMP;
  SET new.ExchPackN = null;
 END IF;
 END IF;
END
       		        
CREATE TRIGGER LivJrnAccGrp1_TU2 NO CASCADE BEFORE UPDATE OF
 JagSum, JagDate, JagPeriodBeginDate, JagPeriodEndDate, JagIsClosed, JagEntStatus, JagIsCopy, JagVolume, JagIsBalance, JagTag, JagOperDate, JagOperNum
ON LivJrnAccGrp1 REFERENCING OLD AS old NEW AS new FOR EACH ROW MODE DB2SQL
WHEN (NOT EXISTS (SELECT * FROM ComTrigSemaph WHERE TrfState =  1  AND TrfTblName = 'LIVJRNACCGRP')
AND new.JagEntStatus =  1  AND
(old.JagSum <> new.JagSum OR
 old.JagDate <> new.JagDate OR
 old.JagPeriodBeginDate <> new.JagPeriodBeginDate OR
 old.JagPeriodEndDate <> new.JagPeriodEndDate OR
 old.JagIsClosed <> new.JagIsClosed OR
 old.JagEntStatus <> new.JagEntStatus OR
 old.JagIsCopy <> new.JagIsCopy OR
 old.JagVolume <> new.JagVolume OR
 old.JagIsBalance <> new.JagIsBalance OR
 old.JagOperDate <> new.JagOperDate OR
 old.JagOperNum <> new.JagOperNum OR
 old.JagTag <> new.JagTag))
SET new.JagUpdDateTime = CURRENT TIMESTAMP, new.ExchPackN = null
...
Рейтинг: 0 / 0
ПОМОГИТЕ! View with Row movment и триггера
    #35320528
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А это поле JAGDATE - не generated случайно?
...
Рейтинг: 0 / 0
ПОМОГИТЕ! View with Row movment и триггера
    #35320606
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinА это поле JAGDATE - не generated случайно?
нет

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
CREATE TABLE DB2ADMIN.LIVJRNACCGRP1
(
    JRNSBJCODE         DECIMAL( 10 )   NOT NULL,
    JRNID              DECIMAL( 10 )   NOT NULL,
    JAGID              DECIMAL( 10 )   NOT NULL,
    JAGSUM             DECIMAL( 12 , 2 ) NOT NULL,
    JAGDATE            DATE          NOT NULL,
    JAGTIME            TIME          NOT NULL,
    JAGCODE            DECIMAL( 3 )    NOT NULL,
    JAGNAME            VARCHAR( 100 )  NOT NULL,
    JAGISRECALC        INTEGER       NOT NULL,
    JAGCLUSTERLEVELNUM INTEGER       NOT NULL,
    JAGPERIODBEGINDATE DATE          NOT NULL,
    JAGPERIODENDDATE   DATE,
    JAGPERIODTYPE      INTEGER       NOT NULL,
    JAGISCLOSED        INTEGER       NOT NULL,
    JAQCOMMENT         VARCHAR( 254 ),
    ACCSBJCODE         DECIMAL( 10 )   NOT NULL,
    ACCID              DECIMAL( 10 )   NOT NULL,
    AGRSBJCODE         DECIMAL( 10 )   NOT NULL,
    AGRID              DECIMAL( 10 )   NOT NULL,
    LINKJRNSBJCODE     DECIMAL( 10 ),
    LINKJRNID          DECIMAL( 10 ),
    LINKJAGID          DECIMAL( 10 ),
    JAGSPRAVTYPE       INTEGER       NOT NULL,
    JAGSPRAVGIDSBJCODE DECIMAL( 10 ),
    JAGSPRAVGID        DECIMAL( 30 ),
    JAGENTSTATUS       INTEGER       NOT NULL,
    USRSBJCODE         DECIMAL( 10 )   NOT NULL,
    USRID              DECIMAL( 10 )   NOT NULL,
    JAGISBALANCE       INTEGER       NOT NULL,
    DISCACCSBJCODE     DECIMAL( 10 ),
    DISCACCID          DECIMAL( 10 ),
    DISCACDID          DECIMAL( 10 ),
    JAGISCOPY          INTEGER,
    JAGTAG             VARCHAR( 20 ),
    JAGCOMMENTTYPE     DECIMAL( 5 ),
    JAGTIMEDATETIME    TIMESTAMP,
    JAGVOLUME          DECIMAL( 14 , 4 ),
    JAGUPDDATETIME     TIMESTAMP,
    JAGOPERDATE        DATE,
    JAGOPERNUM         INTEGER,
    EXCHPACKN          DECIMAL( 7 )
)    IN JRN_ACTIVE

пока выяснил что при наличии вот этого триггера выдает эту ошибку -348

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE TRIGGER LivJrnAccGrp1_TU NO CASCADE BEFORE UPDATE OF JagEntStatus ON LivJrnAccGrp1
REFERENCING NEW AS new FOR EACH ROW MODE DB2SQL 
BEGIN ATOMIC
 IF (new.JagEntStatus =  2 ) THEN
  IF (NOT EXISTS (SELECT * FROM ComTrigSemaph WHERE TrfState IN ( 1 , 2 ) AND TrfTblName = 'LIVJRNACCGRP')) THEN
   IF (EXISTS (SELECT a.JrnID FROM LivJrnCalcType a 
    WHERE (new.JrnSbjCode, new.JrnID, new.JagID,  1 ) = (a.JrnSbjCode, a.JrnID, a.JagID, a.JctEntStatus)))
   THEN SIGNAL SQLSTATE '70222' ('Невозможно удалить запись журнала расчетов верхнего уровня, если существует хотя бы одна запись на нижнем уровне по этой операции');
   END IF;

   IF (EXISTS (SELECT a.JagID FROM LivJrnAccGrp a
    WHERE (new.JrnSbjCode, new.JrnID, new.JagID,  1 ) = (a.LinkJrnSbjCode, a.LinkJrnID, a.LinkJagID, a.JagEntStatus)))
   THEN SIGNAL SQLSTATE '70223' ('Невозможно удалить запись журнала, если существует зависимые');
   END IF;
  END IF;

 IF (NOT EXISTS(SELECT * FROM ComTrigSemaph WHERE TrfState =  1  AND TrfTblName = 'LIVJRNACCGRP')) THEN
  SET new.JagTimeDateTime = CURRENT TIMESTAMP;
  SET new.ExchPackN = null;
 END IF;
 END IF;
END

причем если триггер упростить до
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TRIGGER LivJrnAccGrp1_TU NO CASCADE BEFORE UPDATE OF JagEntStatus ON LivJrnAccGrp1
REFERENCING NEW AS new FOR EACH ROW MODE DB2SQL 
BEGIN ATOMIC
 IF (new.JagEntStatus =  2 ) THEN
  SET new.JagTimeDateTime = CURRENT TIMESTAMP;
  SET new.ExchPackN = null;
 END IF;
END
то ошибка не появляется...
...
Рейтинг: 0 / 0
ПОМОГИТЕ! View with Row movment и триггера
    #35324832
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблему удалось решить, но я не понял почему оно не работало...

путем построчного коментирования в проблемном триггере
выяснилось, что ошибка возникала в запросе
Код: plaintext
1.
2.
3.
   IF (EXISTS (SELECT a.JrnID FROM LivJrnCalcType a 
    WHERE (new.JrnSbjCode, new.JrnID, new.JagID,  1 ) = (a.JrnSbjCode, a.JrnID, a.JagID, a.JctEntStatus)))
   THEN SIGNAL SQLSTATE '70222' ('Невозможно удалить запись журнала расчетов верхнего уровня, если существует хотя бы одна запись на нижнем уровне по этой операции');
   END IF;
где LivJrnCalcType это вьюха так же построенная на 2-х таблицах с row movment,
так вот заменив в этом запросе обращение к вьюхе на обращение к исходным таблицам ошибка перестала появлятся.

в общем я в полном недоумении пока, почему оно таки ругалось на сиквенс при попытке выполнить update?
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / ПОМОГИТЕ! View with Row movment и триггера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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