|
Количество строк в триггере
|
|||
---|---|---|---|
#18+
ASE 15. Есть таблица, "история изменения состояний объектов". В триггере на update надо запретить update сразу нескольких объектов(верней их состояний). Вот такое должно проходить: Код: plaintext 1. 2.
А примерно такое запрещать: Код: plaintext 1. 2.
Первое что пришло на ум, это выбрать из inserted distinct-ом во времянку, а потом проверить кол-во срок. Если больше 1, то rollback и raiserror. Но в триггере все create-ы и select into ЗАПРЕЩЕНЫ. Можно еще покрутить ddl in tran, но это тоже не совсем правильно и все равно может не прокатить Вторая мысль, это использовать новую фичу derived table. Что-то вроде такого: Код: plaintext
Но это тоже не прокатило. Получил, что таблица inserted не найдена. Может это баг? Ну да ладно! Третья мысль была сделать @@rowcount Код: plaintext 1. 2.
И под конец пришла пятая мысль. Код: plaintext
Хороший вариант. Но... Если у меня идентификатор объекта составной. Для облегчения понимания, я выше всегда писал obj_id, но на деле идентификатор объекта составной(3 поля). Код: plaintext
Такое уже не прокатывает Можно конечно воспользоваться вычисляемой колонкой. Добавить вычисляемое поле в котором хранить хэш всех трех obj_id-ов и уже сравнивать так: Код: plaintext
Может есть какой-нибудь более элегантный способ решения? Заранее благодарен!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2010, 23:18 |
|
Количество строк в триггере
|
|||
---|---|---|---|
#18+
cherrex_Den, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2010, 10:25 |
|
Количество строк в триггере
|
|||
---|---|---|---|
#18+
cherrex_Den wrote: > Есть таблица, "история изменения состояний объектов". > В триггере на update надо запретить update сразу нескольких > объектов(верней их состояний). if (select count(*) from INSERTED ) > 1 begin rolback transaction return -- на счёт этого не уверен, как там это делается. end Я не понял, занафига все эти поскипанные мной навороты. > Третья мысль была сделать @@rowcount это неправильная мысль, он уже будет сбит. > select distinct obj_id from inserted > if @@rowcount>*1* Извини, на кой фиг тебе везде distinct ? у тебя в inserted & deleted должен быть первичный ключ, как и в самой таблице. Иначе триггер работать НЕ СМОЖЕТ. Тогда DISTINCT просто бессмысленен -- одно уникальное поле (или набор полей) у тебя уже есть. > if (select count (distinct obj_id) from inserted) > *1* > > > Хороший вариант. Но... Если у меня идентификатор объекта составной. > Для облегчения понимания, я выше всегда писал obj_id, но на деле > идентификатор объекта составной(3 поля). Так пофиг, сколько полей. Тебе надо просто считать кол-во записей. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2010, 18:25 |
|
Количество строк в триггере
|
|||
---|---|---|---|
#18+
MasterZiv, Та нет! Вы немного не поняли суть вопроса. Есть таблица, скажем, объектов. id ...самолет ...трактор ... Есть таблица состояний объектов. idid_objstate ...1самолетработает ... 2самолетремонт ...3тракторработает ... надо запретить Код: plaintext 1. 2.
в триггере делаем следующее Код: plaintext
И такое срабатывает, но если ключом идентификации объекта(самолета) не одно поле id_obj, а три id_obj1, id_obj2, id_obj3 Можно выкрутиться следующим извратом Код: plaintext
Но может, есть более элегантное решение??? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2010, 23:58 |
|
Количество строк в триггере
|
|||
---|---|---|---|
#18+
cherrex_Den wrote: > id id_obj state ... > 1 самолет работает ... > 2 самолет ремонт ... > 3 трактор работает ... > > > > надо запретить > > update "таблица состояний" > .. > where id_obj in ('самолет','трактор') > > > в триггере делаем следующее > > if (select count (distinct obj_id) from inserted) > *1* > > > И такое срабатывает, но если ключом идентификации объекта(самолета) не > одно поле > id_obj, а три id_obj1, id_obj2, id_obj3 > > Можно выкрутиться следующим извратом > > if (select count (distinct obj_id1+obj_id2+obj_id3) from inserted) > *1* Это дебилизм, а не решение. Я всё равно не понимаю, на кой тебе distinct. Тебе надо просто запретить изменение одним оператором более чем одной записи. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2010, 11:09 |
|
Количество строк в триггере
|
|||
---|---|---|---|
#18+
cherrex_Den wrote: > Есть таблица состояний объектов. > > id id_obj state ... > 1 самолет работает ... > 2 самолет ремонт ... > 3 трактор работает ... Я понял наконец что тебе надо. declare @obj_id1 ID1, @obj_id2 ID2, @obj_id3 ID3 select distinct @obj_id1 = obj_id1, @obj_id2 = obj_id2, @obj_id3 = obj_id3 from inserted if @@rowcount > 1 begin rollback trigger ... end Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2010, 12:46 |
|
|
start [/forum/topic.php?fid=55&msg=36843326&tid=2010534]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 318ms |
total: | 480ms |
0 / 0 |