Цитата(Тиль @ 14.3.2007, 10:18 ) | | Триггре на insert в таблицу не пробовал? |
Цитата(NetShadow @ 13.3.2007, 20:28 ) | | проблема была решена добавлением кода к триггеру на событие before update, insert... |
но это не подходит для многосессионной рабыты с таблицами. о чем и говорил LSD.
Цитата(LSD @ 13.3.2007, 22:27 ) | | Это не сработает, если вставка будет идти из разных сессий. |
красивого решения пока нет, но кое что накидал. изврат №1(организовать вставку позиций в таблицу припомоши процедуры):
| Код | declare cursor c1 is select id from hr_emp for update nowait; n number:=0; begin for i in c1 loop n := n + 1; end loop; if n = 6 then raise_application_error(-20000, 'не больше 6-ти записей в татлицу....'); else insert ... end if; end;
|
вобщем это не процедура, но идея понятна (for update nowait)... единственное что меня смущает в этом решении так это пробежка по курсору для подсчета количества позиций.
изврат №2: если первичный ключ организован по сиквенсу то можно задать сиквенсу мин. и макс. значение нужного диапазона в нашем случае от 1..6. тогда при следеющем sq.nextval будет вываливаться ошибка о том что нельзя получить следеющее значение сиквенса, которую можно отловить и по русски сказать юзеру что он не прав... этот способ мне нравиться больше, но я не знаю есть ли потенциальные баги в этом способе, за иключением одного - если какой нить моньяк не увеличит макс. значение сиквенса.
над третьим извратом пока думаю, так сказать изучаю возможности dbms_lock ... |