Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Триггеры  [new]
Dega_M
Member

Откуда:
Сообщений: 12
Здравствуйте!

Есть таблица tbl1(_Id int, _Text varchar(8000)).
Для нее создан триггер на Insert:
...
SELECT @Id = I._Id
FROM tbl1 T, Inserted I
WHERE T._Id = I._Id
EXEC proctbl3Ins(@Id)


Процедура proctbl3Ins:
INSERT INTO tbl3(_Id)
VALUES (@Id)


Выполняю следующий запрос:
INSERT INTO tbl1(_Id, _Text)
SELECT T2._Id, T2._Text
FROM tbl2 T2
WHERE T2._Id > 100


В результате в tbl1 добавляется 10 записей, а в tbl3 только 1. Почему?
18 май 04, 09:58    [683690]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры  [new]
Glory
Member

Откуда:
Сообщений: 104760
Почему?
Потому что в переменную можно занести только одно значение
SELECT @Id = I._Id
FROM tbl1 T, Inserted I
WHERE T._Id = I._Id
18 май 04, 09:59    [683695]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А не нада писать триггеры с предположением, что в операции будет только одна строка.
Кстати, в этом случае процедура и не потребуется.
18 май 04, 10:00    [683698]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры  [new]
Dega_M
Member

Откуда:
Сообщений: 12
Посоветуйте, пожалуйста, что нужно изменит в триггере, чтобы данная "конструкция" заработала.
18 май 04, 10:05    [683707]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Здесь в наличие обычное заблуждение, что триггер вызывается для каждой измененной строки таблицы в инструкции. Происходит же совсем другая вещь - триггер вызывается только один раз на инструкцию!
А написать можно, в этом случа, вообще просто...

INSERT INTO tbl3(_Id)
select _Id from inserted

И не нужна никакая процедура.
18 май 04, 10:08    [683722]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
А если процедура достаточно сложна (и здесь нам только ее часть показали - для затравки), то в триггере придется писать курсор

Что-то типа

Declare @id int

Declare rs Cursor
For
Select _id From inserted

Open rs

Fetch Next From rs Into @id
While @@Fetch_Status <> -1
Begin
 EXEC proctbl3Ins(@Id)
 Fetch Next From rs Into @id
End

Close rs
Deallocate rs
18 май 04, 10:25    [683783]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры  [new]
Dega_M
Member

Откуда:
Сообщений: 12
Спасибо всем!
Суть понял. Буду думать какое решение приемлемо для меня.
18 май 04, 11:20    [683976]     Ответить | Цитировать Сообщить модератору
 Re: Триггеры  [new]
Dega_M
Member

Откуда:
Сообщений: 12
Спасибо всем!
Суть понял. Буду думать какое решение приемлемо для меня.
18 май 04, 11:41    [684048]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить