Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
 Аватар для Worldmen
5 / 8 / 4
Регистрация: 31.08.2013
Сообщений: 350

Триггер на INSERT для другой таблицы

03.10.2016, 01:02. Показов 4697. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно после вставки в таблицу CheckProduct обновить данные в другой таблице Product
Пишу триггер для CheckProduct :
Кликните здесь для просмотра всего текста

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
ALTER TRIGGER [dbo].[Balance]
   ON  [dbo].[CheckProduct] 
   AFTER INSERT
AS 
BEGIN
    
    SET NOCOUNT ON;
 
    DECLARE @vProduckFK INT;
    DECLARE @vIntegerQuantity INT;
    DECLARE @vFractionQuantity INT;
    DECLARE @oldIntegerQuantity INT;
    DECLARE @oldFractionQuantity INT;
 
    SET @vProduckFK = (SELECT ProduckFK FROM inserted); -- ID продукта
    SET @vIntegerQuantity = (SELECT IntegerQuantity FROM inserted); -- новые значения
    SET @vFractionQuantity = (SELECT FractionQuantity FROM inserted);
 
    SET @oldIntegerQuantity = (SELECT IntegerQuantity  FROM Product WHERE Product.ProductId=@vProduckFK);
    SET @oldFractionQuantity= (SELECT FractionQuantity FROM Product WHERE Product.ProductId=@vProduckFK);
    
    UPDATE Product  SET 
        IntegerQuantity = @oldIntegerQuantity + Isnull(@vIntegerQuantity,0), 
        FractionQuantity= @oldFractionQuantity + Isnull(@vFractionQuantity,0)   
        WHERE ProductId = @vProduckFK;
 
    Print '@vProduckFK = '+ str(@vProduckFK);
    Print '@vIntegerQuantity = '+ str(@vIntegerQuantity);
    Print '@vFractionQuantity = '+ str(@vFractionQuantity);
 
    Print '@@ oldIntegerQuantity = '+ str(@oldIntegerQuantity);
    Print '@@ oldFractionQuantity = '+ str(@oldFractionQuantity);
 
END

при этом ничего не обновляет и даже не выводит на печать. Если переделать так (без проверки на NULL):
Кликните здесь для просмотра всего текста

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
ALTER TRIGGER [dbo].[Balance]
   ON  [dbo].[CheckProduct] 
   AFTER INSERT
AS 
BEGIN
    
    SET NOCOUNT ON;
 
    DECLARE @vProduckFK INT;
    DECLARE @vIntegerQuantity INT;
    DECLARE @vFractionQuantity INT;
    DECLARE @oldIntegerQuantity INT;
    DECLARE @oldFractionQuantity INT;
 
    SET @vProduckFK = (SELECT ProduckFK FROM inserted); -- ID продукта
    SET @vIntegerQuantity = (SELECT IntegerQuantity FROM inserted); -- новые значения
    SET @vFractionQuantity = (SELECT FractionQuantity FROM inserted);
 
    SET @oldIntegerQuantity = (SELECT IntegerQuantity  FROM Product WHERE Product.ProductId=@vProduckFK);
    SET @oldFractionQuantity= (SELECT FractionQuantity FROM Product WHERE Product.ProductId=@vProduckFK);
    
    UPDATE Product  SET 
        IntegerQuantity = @oldIntegerQuantity + @vIntegerQuantity, 
        FractionQuantity= @oldFractionQuantity + @vFractionQuantity
        WHERE ProductId = @vProduckFK;
 
    Print '@vProduckFK = '+ str(@vProduckFK);
    Print '@vIntegerQuantity = '+ str(@vIntegerQuantity);
    Print '@vFractionQuantity = '+ str(@vFractionQuantity);
 
    Print '@@ oldIntegerQuantity = '+ str(@oldIntegerQuantity);
    Print '@@ oldFractionQuantity = '+ str(@oldFractionQuantity);
 
END

выводит:
@vProduckFK = 2
@vIntegerQuantity = 1
@vFractionQuantity = 2
(строк обработано: 1)
И ничего не обновляется.
Делаю так:
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
ALTER TRIGGER [dbo].[Balance]
   ON  [dbo].[CheckProduct] 
   AFTER INSERT
AS 
BEGIN
    
    SET NOCOUNT ON;
 
    DECLARE @vProduckFK INT;
    DECLARE @vIntegerQuantity INT;
    DECLARE @vFractionQuantity INT;
    DECLARE @oldIntegerQuantity INT;
    DECLARE @oldFractionQuantity INT;
 
    SET @vProduckFK = (SELECT ProduckFK FROM inserted); -- ID продукта
    SET @vIntegerQuantity = (SELECT IntegerQuantity FROM inserted); -- новые значения
    SET @vFractionQuantity = (SELECT FractionQuantity FROM inserted);
 
    SET @oldIntegerQuantity = ISNULL((SELECT IntegerQuantity  FROM Product WHERE Product.ProductId=@vProduckFK),0);
    SET @oldFractionQuantity= ISNULL((SELECT FractionQuantity FROM Product WHERE Product.ProductId=@vProduckFK),0);
    
    UPDATE Product  SET 
        IntegerQuantity = @oldIntegerQuantity + @vIntegerQuantity, 
        FractionQuantity= @oldFractionQuantity + @vFractionQuantity
        WHERE ProductId = @vProduckFK;
 
    Print '@vProduckFK = '+ str(@vProduckFK);
    Print '@vIntegerQuantity = '+ str(@vIntegerQuantity);
    Print '@vFractionQuantity = '+ str(@vFractionQuantity);
 
    Print '@@ oldIntegerQuantity = '+ str(@oldIntegerQuantity);
    Print '@@ oldFractionQuantity = '+ str(@oldFractionQuantity);
 
END

выполняю вставку:
SQL
1
INSERT INTO dbo.CheckProduct VALUES (18, 2, 2, 1, 2);
Последние два значения в обновляемой таблице = NULL, поэтому триггер выводит правильно:
@vProduckFK = 2
@vIntegerQuantity = 1
@vFractionQuantity = 2
@@ oldIntegerQuantity = 0
@@ oldFractionQuantity = 0
А в обновляемой таблице данные не поменялись.

Добавлено через 9 минут
Заметил, что обновляются только те записи где в поле нет NULL
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.10.2016, 01:02
Ответы с готовыми решениями:

Триггер для добавления к строке название таблицы, в которой содержится триггер
Есть таблицы База_Практик. В неё добавляю предприятие, и автоматически нужно добавить это предприятие с именем таблицы База практик в...

Триггер для добавления к строке название таблицы, в которой содержится триггер
Есть таблицы База_Практик. В неё добавляю предприятие, и автоматически нужно добавить это предприятие с именем таблицы База практик в...

Триггер на заполнение столбца таблицы на основе другой
Есть две таблицы: 1. Клиенты (код клиента, ФИО, количество дел) 2.Дела клиентов (номер дела, код клиента) У клиента может быть...

3
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
03.10.2016, 12:44
1. В таблице, в которую вставляете, явно перечисляйте поля. Иначе непонятно, что куда вставляете.
2. В триггере избегайте скалярных переменных. Стоит вам вставить одной командой миллион записей,
и вставленные значения в переменную просто не поместятся!
3. Все записи обрабатывайте вместе в одной инструкции INSERT, UPDATE, DELETE или MERGE,
при необходимости используйте JOINы и т.п.

Кстати, не хватает иформации о наличии FOREIGN KEY, например. Вставка не вызывает каких-нибудь сообщений сервера?
Триггер, кроме всего прочего, может быть в отключённом состоянии и не вызываться из-за этого.
0
 Аватар для Worldmen
5 / 8 / 4
Регистрация: 31.08.2013
Сообщений: 350
03.10.2016, 21:04  [ТС]
Цитата Сообщение от iap Посмотреть сообщение
2. В триггере избегайте скалярных переменных.
Вы имеете ввиду, что не делать так:
SQL
1
2
    SET @vProduckFK = (SELECT ProduckFK FROM inserted); -- ID продукта
    SET @vIntegerQuantity = (SELECT IntegerQuantity FROM inserted); -- новые значения
А как тогда правильно делать?
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
03.10.2016, 22:11
Лучший ответ Сообщение было отмечено Worldmen как решение

Решение

Цитата Сообщение от Worldmen Посмотреть сообщение
А как тогда правильно делать?
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
alter trigger dbo.Balance
on dbo.CheckProduct
after insert
as 
begin
 set nocount on;
 
 if not exists(select * from inserted)
  return;
 
 update p
  set
   IntegerQuantity += isnull(i.IntegerQuantity, 0),
   FractionQuantity += isnull(i.FractionQuantity, 0)
 from
  inserted i join
  dbo.Product p on p.ProductID = i.ProductFK;
 
end;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.10.2016, 22:11
Помогаю со студенческими работами здесь

Триггер SUM (вычисляемого поля из другой таблицы) с JOIN-ом
В институте преподают курс SQL На лабораторной триггеры задали написать триггер. Есть таблицы "Концерт Общее" и...

Вычисляемое поле одной таблицы по количеству записей в другой: триггер?
Добрый день! Вопрос начинающего: необходимо, чтобы поле Tours.Capacity автоматически вычислялось по количеству записей в Tourists-Tours...

Триггер для таблицы
Всем привет! Есть три таблицы Книга(ид_книги, год выпуска...) Автор(ид_автора, год рождения....), Книга-Автор(ид_книги, ид_автора)....

Триггер INSTEAD OF INSERT
Уважаемые программисты, помогите решить возникнувший вопрос по поводу триггера INSTEAD OF INSERT в T-sql. Есть такой код: CREATE...

Триггер INSERT
Помогите написать триггер. Есть 2 таблицы: Улица и Сотрудник. Улица: Наименование; Сотрудник: Табельный_номер Фамилия .... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru