powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / помогите с триггером
5 сообщений из 5, страница 1 из 1
помогите с триггером
    #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
помогите с триггером
    #32016681
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 andrei_grigorash

Я честно говоря никогда не пользовался конструкцией If UPDATE(field), а просто сравнивал значение нужного поля до обновления и после и если они не равны, тогда начинал транзакцию.
...
Рейтинг: 0 / 0
помогите с триггером
    #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
помогите с триггером
    #32016689
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IF Update() работает если указанное поле фигурировало в Update или insert. Изменилось ли оно фактически - надо проверять самому.

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


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