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

Занимаемся тут разработкой структуры базы приложения. В одной из таблиц есть поле-флаг (smallint), которое может принимать только значения 0,1 (навесил констрайнт). Согласно технологии работы среди записей таблицы только одна может иметь значение 1, остальные должны иметь значение 0.

Вопрос, как это сделать на уровне базы? Пытался создать триггер на добавление и изменение, который апдейтит оставшиеся записи. Но DB2 ругается на применение неподдерживаемых SQL-операторов. Можно ли вообще реализовать это на уровне базы? ХП?

PS. На уровне приложения я это уже сделал. Но хотелось бы, чтобы база сама это делала.

С уважением, Семен Попов
...
Рейтинг: 0 / 0
При insert и update изменить значение поля остальных записей
    #36965725
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме того, что у триггера after возможностей поболе, чем триггера before, замечу такую вещь. На самом деле вам эта колонка вообще не нужна. Вы хотите отметить какую-то единичную запись среди множества других? Просто запомните ключ этой записи где-то ещё. Например, в какой-то другой таблице, где ровно одна запись, а вставка и удаление запрещены триггерами.
...
Рейтинг: 0 / 0
При insert и update изменить значение поля остальных записей
    #36965746
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравните, к примеру, каково будет искать ту отмеченную запись - по колонке (индекс по ней будет выглядеть... странным, особенно учитывая, что битмаповых индексов в духе Oracle у DB2 нет), или просто зная её ключ.
...
Рейтинг: 0 / 0
При insert и update изменить значение поля остальных записей
    #36965779
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и что-то наподобие
Код: plaintext
1.
2.
  select t1.*, case when t2.id is null then  0  else  1  end
  from t1 left join t2 on t1.id=t2.id
по желанию
...
Рейтинг: 0 / 0
При insert и update изменить значение поля остальных записей
    #36965800
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor MetelitsaКроме того, что у триггера after возможностей поболе, чем триггера before, замечу такую вещь. На самом деле вам эта колонка вообще не нужна. Вы хотите отметить какую-то единичную запись среди множества других? Просто запомните ключ этой записи где-то ещё. Например, в какой-то другой таблице, где ровно одна запись, а вставка и удаление запрещены триггерами.Спасибо. Согласен с Вами, что вынести ID отмеченной записи в отдельную таблицу было бы разумнее. Подумаю над такой реализацией. У меня записей в таблице будет немного - это справочник. Поэтому может и триггера было бы достаточно.
Дейcтвительно, триггер after съел то, что я хочу (до этого пробовал before). А именно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create trigger UPD_MYTAB
after update on MYTAB
referencing new as n old as o 
for each row mode DB2SQL
begin atomic
 if n.FLAG= 1  then
    update MYTAB as t set t.FLAG= 0  where t.FLAG= 1  and t.ID<>n.ID;
 end if;
end
@
Чем чревато использование такого триггера?
...
Рейтинг: 0 / 0
При insert и update изменить значение поля остальных записей
    #36966357
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На первый взгляд - ничем. Но интересно будет помедитировать на тему одновременного присвоения двумя юзерами тому полю 1 разным записям. Чисто из познавательных соображений.
...
Рейтинг: 0 / 0
При insert и update изменить значение поля остальных записей
    #36971160
Semen Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor MetelitsaНа первый взгляд - ничем. Но интересно будет помедитировать на тему одновременного присвоения двумя юзерами тому полю 1 разным записям. Чисто из познавательных соображений.Спасибо, попробовали. У одного из пользователей произошел откат транзакции. Тогда может в триггере залочить таблицу перед апдейтом, чтобы другой пользователь ждал пока не разлочится?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / При insert и update изменить значение поля остальных записей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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