Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / помогите с триггером / 5 сообщений из 5, страница 1 из 1
08.11.2001, 06:32
    #32016675
andrei_grigorash
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с триггером
Помогите пжлста начинающему.
Есть 2 таблицы. Изменения определенного поля передаются в из одной в другую и там добавляются. У меня происходит следующее - если проходят изменения в поле, которое указано в триггере то всё ОК, если же проходит изменение любого другого поля в первой таблице, то всегда выполняется первая часть триггера, те значение поля во второй таблице всегда уменьшается на величину поля первой таблицы. Почему триггер срабатывает если нет обновления указанного поля?
CREATE TRIGGER ПриходТовара_UTrig ON dbo.ПриходТовара FOR UPDATE AS
SET NOCOUNT ON
/* * Меняет фактическое количество данного товара на данном складе */
If UPDATE(Количество)
BEGIN Transaction
UPDATE ОстаткиПоТовару
Set Наличие=Наличие-deleted.Количество
from deleted
WHERE (ОстаткиПоТовару.КодТовара =deleted.КодТовара And ОстаткиПоТовару.КодСклада=deleted.КодСклада)
COMMIT transaction
UPDATE ОстаткиПоТовару
Set Наличие=Наличие+inserted.Количество from inserted
WHERE (ОстаткиПоТовару.КодТовара =inserted.КодТовара And ОстаткиПоТовару.КодСклада=inserted.КодСклада)
...
Рейтинг: 0 / 0
08.11.2001, 07:26
    #32016681
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с триггером
2 andrei_grigorash

Я честно говоря никогда не пользовался конструкцией If UPDATE(field), а просто сравнивал значение нужного поля до обновления и после и если они не равны, тогда начинал транзакцию.
...
Рейтинг: 0 / 0
08.11.2001, 07:30
    #32016682
Moth
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с триггером
CREATE TRIGGER ПриходТовара_UTrig ON dbo.ПриходТовара FOR UPDATE AS
SET NOCOUNT ON
/* * Меняет фактическое количество данного товара на данном складе */
If UPDATE(Количество)
>>>>>BEGIN
BEGIN Transaction
UPDATE ОстаткиПоТовару
Set Наличие=Наличие-deleted.Количество
from deleted
WHERE (ОстаткиПоТовару.КодТовара =deleted.КодТовара And ОстаткиПоТовару.КодСклада=deleted.КодСклада)
COMMIT transaction
UPDATE ОстаткиПоТовару
Set Наличие=Наличие+inserted.Количество from inserted
WHERE (ОстаткиПоТовару.КодТовара =inserted.КодТовара And ОстаткиПоТовару.КодСклада=inserted.КодСклада)
>>>>>END
>>>>>SET NOCOUNT OFF
А структура IF Update() нормально работает.
...
Рейтинг: 0 / 0
08.11.2001, 08:17
    #32016689
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с триггером
IF Update() работает если указанное поле фигурировало в Update или insert. Изменилось ли оно фактически - надо проверять самому.

И еще - транзакции в триггере объявлять не надо.
...
Рейтинг: 0 / 0
08.11.2001, 11:58
    #32016696
Владимир Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помогите с триггером
Действительно, как подсказывают Moth и SergSuper, основная ошибка заключается в использовании BEGIN Transaction вместо
BEGIN ... END. Но кроме того есть и другой подвох. Например, в таблице ПриходТовара изменили КодТовара или КодСклада. Если триггер не обработает эти изменения, остатки на складе будут неправильными. Поэтому правильным будет вариант с проверкой
If UPDATE(Количество) or UPDATE(КодТовара) or UPDATE(КодСклада)
BEGIN
-- Меняет количество товара на складе
...
END
или с проверкой фактических изменений этих трёх атрибутов (но это совсем другая история ).
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / помогите с триггером / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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