powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Количество строк в триггере
7 сообщений из 7, страница 1 из 1
Количество строк в триггере
    #36842096
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASE 15.

Есть таблица, "история изменения состояний объектов".
В триггере на update надо запретить update сразу нескольких объектов(верней их состояний).

Вот такое должно проходить:

Код: plaintext
1.
2.
update st_obj
...
where obj_id =  5 

А примерно такое запрещать:

Код: plaintext
1.
2.
update st_obj
...
where obj_id in ( 3 , 5 )

Первое что пришло на ум, это выбрать из inserted distinct-ом во времянку, а потом проверить кол-во срок. Если больше 1, то rollback и raiserror.
Но в триггере все create-ы и select into ЗАПРЕЩЕНЫ.
Можно еще покрутить ddl in tran, но это тоже не совсем правильно и все равно может не прокатить

Вторая мысль, это использовать новую фичу derived table.
Что-то вроде такого:

Код: plaintext
if (select count(*) from (select distinct obj_id from inserted)dt) >  1 

Но это тоже не прокатило. Получил, что таблица inserted не найдена. Может это баг? Ну да ладно!

Третья мысль была сделать @@rowcount

Код: plaintext
1.
2.
select distinct obj_id from inserted
if @@rowcount> 1 
...
Но писать обычный select в триггере..., ну вы сами понимаете...

И под конец пришла пятая мысль.

Код: plaintext
if (select count (distinct obj_id) from inserted) >  1 

Хороший вариант. Но... Если у меня идентификатор объекта составной.
Для облегчения понимания, я выше всегда писал obj_id, но на деле идентификатор объекта составной(3 поля).

Код: plaintext
if (select count (distinct obj_id1,obj_id2,obj_id3) from inserted) >  1 

Такое уже не прокатывает
Можно конечно воспользоваться вычисляемой колонкой. Добавить вычисляемое поле в котором хранить хэш всех трех obj_id-ов и уже сравнивать так:
Код: plaintext
if (select count (distinct obj_id_hash) from inserted) >  1 

Может есть какой-нибудь более элегантный способ решения?

Заранее благодарен!!!
...
Рейтинг: 0 / 0
Количество строк в триггере
    #36842204
VitaliyM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cherrex_Den,


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create trigger
...
as
begin
  if @@rowcount <  2 
  begin
  ...
  end
  else
  begin
  ..
  end
end
...
Рейтинг: 0 / 0
Количество строк в триггере
    #36842467
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Количество строк в триггере
    #36842644
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Та нет! Вы немного не поняли суть вопроса.

Есть таблица, скажем, объектов.

id ...самолет ...трактор ...

Есть таблица состояний объектов.

idid_objstate ...1самолетработает ... 2самолетремонт ...3тракторработает ...

надо запретить

Код: plaintext
1.
2.
update "таблица состояний"
...
where id_obj in ('самолет','трактор')

в триггере делаем следующее

Код: plaintext
if (select count (distinct obj_id) from inserted) >  1 

И такое срабатывает, но если ключом идентификации объекта(самолета) не одно поле
id_obj, а три id_obj1, id_obj2, id_obj3

Можно выкрутиться следующим извратом

Код: plaintext
if (select count (distinct obj_id1+obj_id2+obj_id3) from inserted) >  1 

Но может, есть более элегантное решение???
...
Рейтинг: 0 / 0
Количество строк в триггере
    #36843061
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Количество строк в триггере
    #36843326
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Количество строк в триггере
    #36844032
cherrex_Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Спасибо! Попробую!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Количество строк в триггере
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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