Научно-образовательный IT-форум

Объявление

На форуме имеется приватный контент. Условия получения доступа к нему см. по ссылке

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Научно-образовательный IT-форум » Задачи и вопросы » [+] Триггеры и процедуры в Microsoft SQL Server


[+] Триггеры и процедуры в Microsoft SQL Server

Сообщений 21 страница 22 из 22

21

Запрос на добавление поставки должен выглядеть как-то так:
--начинаем транзакцию
BEGIN TRASACTION

BEGIN TRY 
  --добавляем записи в таблицы
  INSERT INTO [Поставки] ...
  INSERT INTO [Сведения о поставках] ...
 
  --фиксируем транзакцию
  COMMIT TRANSACTION;
END TRY 
BEGIN CATCH
  --откатываем транзакцию
  ROLLBACK TRANSACTION;
END CATCH


Триггер такой:
CREATE TRIGGER [Название триггера]
    ON [Сведения о поставках] INSTEAD OF INSERT
    AS BEGIN
  -- если существует необходимый товар
  IF EXISTS (SELECT *
        FROM [Товары] t
          INNER JOIN inserted i ON t.[ID товара] = i.[ID товара]
          )
    --добавляем запись в таблицу
        INSERT INTO [Сведения о поставках]
        SELECT ...
        FROM inserted;
    --увеличиваем количество товаров на складе
    UPDATE s
    SET s.[Количество]=s.[Количество] + i.[Количество]
    FROM [Складские запасы] s
      INNER JOIN inserted i ON s.[ID товара] = i.[ID товара]
  -- иначе генерируем ошибку
  ELSE
    RAISEERROR ...
END

Кроме этого, необходимо примерно такой-же триггер создать для таблицы [Поставки]. Там будет всё то же самое для поставщиков, только не нужно выполнять инструкцию UPDATE.

22

Спасибо за помощь!
Вот решение данной задачи:

Запрос на добавление:

--Начинаем транзакцию
BEGIN TRANSACTION
BEGIN TRY
  --добавляем записи в таблицы
  INSERT INTO [Поставки] VALUES (223488,12399,'2018-07-02')
  INSERT INTO [Сведения о поставках] VALUES(223488,1,14366,150,20)
  --фиксируем транзакцию
  COMMIT TRANSACTION
END TRY
BEGIN CATCH
  --откатываем транзакцию
  ROLLBACK TRANSACTION;
  THROW 
END CATCH

SQL-скрипт триггера для таблицы «Поставки»:

CREATE TRIGGER  Number_of _goods
ON [Поставки] INSTEAD OF INSERT
AS
BEGIN
  -- Если существует необходимый поставщик
  IF EXISTS(SELECT * FROM [Поставщики] s INNER JOIN inserted i ON s.[ID поставщика]=i.[ID поставщика])
  BEGIN
    -- Добавляем записи в таблицу Поставщики
    INSERT INTO [Поставки]
    SELECT [ID поставки],[ID поставщика],[Дата]
    FROM inserted
   
  END;
  --Иначе генерируем ошибку
  ELSE
    THROW 60000, 'Такого поставщика нет в таблице Поставщики', 1
  END

SQL-скрипт триггера для таблицы «Сведения о поставках»:

CREATE TRIGGER Suplier
ON [Сведения о поставках] INSTEAD OF INSERT
AS
BEGIN
  --если существует необходимый товар
  IF EXISTS(SELECT * FROM [Товары] g INNER JOIN inserted i ON g.[ID Товара]=i.[ID товара])
  BEGIN
    --добавляем записи в таблицу
    INSERT INTO [Сведения о поставках]
    SELECT [ID поставки],[Номер позиции],[ID товара],[Цена],[Количество]
    FROM inserted
    --обнавляем Количество товара на складе
    UPDATE [Складские запасы]
    SET [Количество] = s.Количество
    FROM [Складские запасы] s INNER JOIN inserted i on s.[ID Товара]=i.[ID Товара]

  END;
  --Иначе генерируем ошибку
  ELSE
    THROW 60001, 'Такого товара нет в таблице Товары', 1
END


Вы здесь » Научно-образовательный IT-форум » Задачи и вопросы » [+] Триггеры и процедуры в Microsoft SQL Server