powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Одинаковые поля родительской и дочерней таблицы
14 сообщений из 14, страница 1 из 1
Одинаковые поля родительской и дочерней таблицы
    #36979478
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте всем!

DB2 8.2, fp16
В одной из дочерних таблиц дублируется поле FLD из родительской таблицы. Как сделать, чтобы при добавлении и изменении дочерней записи в FLD всегда вносилось значение FLD родителя?

С уважением, Семен Попов
...
Рейтинг: 0 / 0
Одинаковые поля родительской и дочерней таблицы
    #36980986
FireCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггеры after.
...
Рейтинг: 0 / 0
Одинаковые поля родительской и дочерней таблицы
    #36982518
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FireCatТриггеры after.А не before? Например, родительская таблица PRNTTAB (PRNTID, SAMEFLD,...) и дочерняя CHLDTAB (CHLDID, PRNTID, SAMEFLD, ...). Тогда триггер before на дочернюю будет выглядеть примерно так:
Код: plaintext
1.
2.
3.
4.
5.
create trigger INSB_CHLD
no cascade before insert on CHLDTAB
referencing new as n
for each row mode DB2SQL
set n.SAMEFLD=select SAMEFLD from PRNTTAB where PRNTID=n.PRNTID
@
Поправьте, если код неверный.

А вообще, без триггера можно обойтись? Например, в дочерней таблице объявить поле SAMEFLD как generated always:
Код: plaintext
1.
2.
3.
4.
5.
6.
create table CHLDTAB {
CHLDID integer not null generated always as identity ( start with  1 , increment by  1 , no cycle, no cache, no order ),
PRNTID integer not null,

SAMEFLD short generated always as (select SAMEFLD from PRNTTAB where PRNTTAB.PRNTID=PRNTID),
...
}
Или это неправильно?
...
Рейтинг: 0 / 0
Одинаковые поля родительской и дочерней таблицы
    #36982555
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Semen PopovА вообще, без триггера можно обойтись? Например, в дочерней таблице объявить поле SAMEFLD как generated always:
Код: plaintext
1.
2.
3.
4.
5.
6.
create table CHLDTAB {
CHLDID integer not null generated always as identity ( start with  1 , increment by  1 , no cycle, no cache, no order ),
PRNTID integer not null,

SAMEFLD short generated always as (select SAMEFLD from PRNTTAB where PRNTTAB.PRNTID=PRNTID),
...
}
Или это неправильно?Так не получится.
дока
GENERATED ALWAYS AS (generation-expression)
Specifies that the definition of the column is based on an expression. (If the expression for a GENERATED ALWAYS column includes a user-defined external function, changing the executable for the function (such that the results change for given arguments) can result in inconsistent data. This can be avoided by using the SET INTEGRITY statement to force the generation of new values.) The generation-expression cannot contain any of the following (SQLSTATE 42621):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
        *  Subqueries 
        * Column functions
        * Dereference operations or DEREF functions
        * User-defined or built-in functions that are non-deterministic
        * User-defined functions using the EXTERNAL ACTION option
        * User-defined functions that are not defined with NO SQL
        * Host variables or parameter markers
        * Special registers
        * References to columns defined later in the column list
        * References to other generated columns
Ради интереса: а в чём причина такой денормализации у вас?
...
Рейтинг: 0 / 0
Одинаковые поля родительской и дочерней таблицы
    #36982629
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinТак не получится.Понял. Спасибо.
Mark BarinsteinРади интереса: а в чём причина такой денормализации у вас?Это мне нужно для реализации ограничения уникальности в дочерней таблице CHLDTAB (CHLDID, PRNTID, SAMEFLD, INPUTNUM ...) - constraint CHLD_UNK unique (SAMEFLD,INPUTNUM).
...
Рейтинг: 0 / 0
Одинаковые поля родительской и дочерней таблицы
    #36982660
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если мне нужно в две переменные одним запросом вытащить? Что-то не получается. Скрипт
Код: plaintext
1.
2.
3.
4.
5.
6.
create trigger INSB_CHLD
no cascade before insert on CHLDTAB
referencing new as n
for each row mode DB2SQL
set n.FLD1=select FLD1 from PRNTTAB where PRNTID=n.PRNTID,
     n.FLD2=select FLD2 from PRNTTAB where PRNTID=n.PRNTID
@
не очень хорош по понятным причинам
...
Рейтинг: 0 / 0
Одинаковые поля родительской и дочерней таблицы
    #36982697
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen PopovЭто мне нужно для реализации ограничения уникальности в дочерней таблице CHLDTAB (CHLDID, PRNTID, SAMEFLD, INPUTNUM ...) - constraint CHLD_UNK unique (SAMEFLD,INPUTNUM).Почему нельзя вместо SAMEFLD использовать PRNTID для этого?

Для триггера:
Код: plaintext
set (n.FLD1, n.FLD2)=(select FLD1, FLD2 from PRNTTAB where PRNTID=n.PRNTID)
...
Рейтинг: 0 / 0
Одинаковые поля родительской и дочерней таблицы
    #36982755
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как workaround: создать вьюшку. На вьюшку повесить триггер INSTEAD OF. А там реализовать какую угодно логику.
...
Рейтинг: 0 / 0
Одинаковые поля родительской и дочерней таблицы
    #36982805
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinПочему нельзя вместо SAMEFLD использовать PRNTID для этого?Потому что PRNTID однозначно не определяет SAMEFLD. По одному значению SAMEFLD может быть много записей как в родительской так и в дочерней таблицах. Но в обоих таблицах поля SAMEFLD участвуют в ограничении уникальности.
Например, реализация журнала регистрации (таблица-родитель) и обработки документов (дочерняя таблица) по подразделениям организации. На одну запись регистрации по технологии может быть несколько обработок. В журнале регистрации поле "Номер регистрации" (INPUTNUM) не должно повторяться в пределах подразделения (поле DEPID) - unique (DEPID,INPUTNUM). Аналогично в журнале обработки поле "Номер обработки" (PRCSNUM) не должно повторяться в пределах подразделения (поле DEPID) - unique (DEPID,PRCSNUM). Но обработка документа всегда производится в подразделении, где он был зарегистрирован. Поэтому в дочерней всегда инициализирую DEPID родителя.
Mark BarinsteinДля триггера:
Код: plaintext
set (n.FLD1, n.FLD2)=(select FLD1, FLD2 from PRNTTAB where PRNTID=n.PRNTID)
Спасибо
...
Рейтинг: 0 / 0
Одинаковые поля родительской и дочерней таблицы
    #36982809
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanКак workaround: создать вьюшку. На вьюшку повесить триггер INSTEAD OF. А там реализовать какую угодно логику.Спасибо. Подумаю
...
Рейтинг: 0 / 0
Одинаковые поля родительской и дочерней таблицы
    #36982871
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanКак workaround: создать вьюшку. На вьюшку повесить триггер INSTEAD OF. А там реализовать какую угодно логику.Кстати, это Вы наверно к моей недавней теме сказали - об организации взаимодействия справочников и рабочих данных? Интересное решение. Чем плодить триггеры в рабочих таблицах и справочниках можно было бы создать вьюху и в ней триггер, отслеживающий логику и целостность данных. Спасибо. А триггер INSTEAD OF будет отрабатывать, если я буду проводить операции только с одной таблицой из вьюхи?
...
Рейтинг: 0 / 0
Одинаковые поля родительской и дочерней таблицы
    #36982920
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Semen PopovА триггер INSTEAD OF будет отрабатывать, если я буду проводить операции только с одной таблицой из вьюхи?Наприемр, MyView - это вьюха, склеивающая (join) таблицы NSITAB и WRKTAB. В MyView создать триггер MV_TRIGGER (INSTEAD OF). Будет ли работать MV_TRIGGER, если, например удалить запись из NSITAB (delete from NSITAB where NSICOD=1)?
...
Рейтинг: 0 / 0
Одинаковые поля родительской и дочерней таблицы
    #36982959
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Semen PopovНаприемр, MyView - это вьюха, склеивающая (join) таблицы NSITAB и WRKTAB. В MyView создать триггер MV_TRIGGER (INSTEAD OF). Будет ли работать MV_TRIGGER, если, например удалить запись из NSITAB (delete from NSITAB where NSICOD=1)?INSTEAD OF триггеры будут работать только если вы будете делать insert / update / delete в MyView, а не в таблицах, на которых вью стоит.
В вашем случае для инициализации DEPID при вставке в дочернюю вполне подойдёт before insert на неё.
...
Рейтинг: 0 / 0
Одинаковые поля родительской и дочерней таблицы
    #36982994
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Премного благодарен всем!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Одинаковые поля родительской и дочерней таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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