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

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

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

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

С уважением, Семен Попов
...
Рейтинг: 0 / 0
19.11.2010, 12:28
    #36965725
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При insert и update изменить значение поля остальных записей
Кроме того, что у триггера after возможностей поболе, чем триггера before, замечу такую вещь. На самом деле вам эта колонка вообще не нужна. Вы хотите отметить какую-то единичную запись среди множества других? Просто запомните ключ этой записи где-то ещё. Например, в какой-то другой таблице, где ровно одна запись, а вставка и удаление запрещены триггерами.
...
Рейтинг: 0 / 0
19.11.2010, 12:35
    #36965746
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При insert и update изменить значение поля остальных записей
Сравните, к примеру, каково будет искать ту отмеченную запись - по колонке (индекс по ней будет выглядеть... странным, особенно учитывая, что битмаповых индексов в духе Oracle у DB2 нет), или просто зная её ключ.
...
Рейтинг: 0 / 0
19.11.2010, 12:44
    #36965779
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При insert и update изменить значение поля остальных записей
и что-то наподобие
Код: 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
19.11.2010, 12:53
    #36965800
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При insert и update изменить значение поля остальных записей
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
19.11.2010, 16:42
    #36966357
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При insert и update изменить значение поля остальных записей
На первый взгляд - ничем. Но интересно будет помедитировать на тему одновременного присвоения двумя юзерами тому полю 1 разным записям. Чисто из познавательных соображений.
...
Рейтинг: 0 / 0
23.11.2010, 10:14
    #36971160
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
При insert и update изменить значение поля остальных записей
Victor MetelitsaНа первый взгляд - ничем. Но интересно будет помедитировать на тему одновременного присвоения двумя юзерами тому полю 1 разным записям. Чисто из познавательных соображений.Спасибо, попробовали. У одного из пользователей произошел откат транзакции. Тогда может в триггере залочить таблицу перед апдейтом, чтобы другой пользователь ждал пока не разлочится?
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / При insert и update изменить значение поля остальных записей / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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