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

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

С уважением, Семен Попов
...
Рейтинг: 0 / 0
27.11.2010, 20:42
    #36980986
FireCat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одинаковые поля родительской и дочерней таблицы
Триггеры after.
...
Рейтинг: 0 / 0
29.11.2010, 08:54
    #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
29.11.2010, 09:33
    #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
29.11.2010, 10:23
    #36982629
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одинаковые поля родительской и дочерней таблицы
Mark BarinsteinТак не получится.Понял. Спасибо.
Mark BarinsteinРади интереса: а в чём причина такой денормализации у вас?Это мне нужно для реализации ограничения уникальности в дочерней таблице CHLDTAB (CHLDID, PRNTID, SAMEFLD, INPUTNUM ...) - constraint CHLD_UNK unique (SAMEFLD,INPUTNUM).
...
Рейтинг: 0 / 0
29.11.2010, 10:44
    #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
29.11.2010, 11:03
    #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
29.11.2010, 11:24
    #36982755
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одинаковые поля родительской и дочерней таблицы
Как workaround: создать вьюшку. На вьюшку повесить триггер INSTEAD OF. А там реализовать какую угодно логику.
...
Рейтинг: 0 / 0
29.11.2010, 11:45
    #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
29.11.2010, 11:46
    #36982809
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одинаковые поля родительской и дочерней таблицы
gardenmanКак workaround: создать вьюшку. На вьюшку повесить триггер INSTEAD OF. А там реализовать какую угодно логику.Спасибо. Подумаю
...
Рейтинг: 0 / 0
29.11.2010, 12:03
    #36982871
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одинаковые поля родительской и дочерней таблицы
gardenmanКак workaround: создать вьюшку. На вьюшку повесить триггер INSTEAD OF. А там реализовать какую угодно логику.Кстати, это Вы наверно к моей недавней теме сказали - об организации взаимодействия справочников и рабочих данных? Интересное решение. Чем плодить триггеры в рабочих таблицах и справочниках можно было бы создать вьюху и в ней триггер, отслеживающий логику и целостность данных. Спасибо. А триггер INSTEAD OF будет отрабатывать, если я буду проводить операции только с одной таблицой из вьюхи?
...
Рейтинг: 0 / 0
29.11.2010, 12:22
    #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
29.11.2010, 12:34
    #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
29.11.2010, 12:44
    #36982994
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одинаковые поля родительской и дочерней таблицы
Премного благодарен всем!
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Одинаковые поля родительской и дочерней таблицы / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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