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

Откуда:
Сообщений: 17
Здравствуйте. Помогите доработать последующий триггер.
Есть таблица:
CREATE TABLE ТУР(
Номер_тура int Not Null Primary Key,
Тип_отеля TinyInt Not Null,
Популярность_тура TinyInt Null,
Стоимость int Not Null,
Программа varchar(1500) Not Null,
Страна varchar(50) Not Null,
Регион varchar(50) Not Null,
Неблагополучные_отели varchar(1000) Null
)


Необходимо написать к ней следующее: последующий триггер на изменение стоимости тура - если в результате изменения стоимость тура для какого-то типа отеля окажется выше, чем у отеля с бОльшим количеством звезд, то это изменение не делать.

Что я написал:
CREATE TRIGGER Триггер_b
ON Тур AFTER UPDATE
AS
--Если произошло изменение стоимости, то запускаем триггер
IF UPDATE(Стоимость)
BEGIN
IF EXISTS(
--находим туры, у которых была изменена стоимость
SELECT *
FROM (
select inserted.Номер_тура, inserted.Тип_отеля, inserted.Стоимость
from deleted LEFT JOIN inserted ON deleted.Стоимость = inserted.Стоимость 
WHERE inserted.Стоимость IS NULL) as a
--здесь, я полагаю, необходимо выполнить проверку: не больше ли стоимость тура с мЕньшим кол-вом звезд, чем у другого тура
where a.Номер_тура IN
(
SELECT тур.Номер_тура, тур.Тип_отеля, тур.Стоимость
FROM тур
WHERE  a.Стоимость > тур.Стоимость and a.Тип_отеля < тур.Тип_отеля
))
BEGIN
RAISERROR('Нельзя изменить стоимость тура!', 16, 1)
ROLLBACK TRANSACTION
END
END
7 мар 17, 23:57    [20273035]     Ответить | Цитировать Сообщить модератору
 Re: Последующий триггер.  [new]
aleks2
Guest
Тредстартеру прямой путь в управдомы.
8 мар 17, 10:36    [20273910]     Ответить | Цитировать Сообщить модератору
 Re: Последующий триггер.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Alex767
Необходимо написать к ней следующее: последующий триггер на изменение стоимости тура - если в результате изменения стоимость тура для какого-то типа отеля окажется выше, чем у отеля с бОльшим количеством звезд, то это изменение не делать.
Что то у вас совсем неправильно.
Во первых, "находим туры, у которых была изменена стоимость" - нужно связывать deleted и inserted по ключу.
select inserted.Номер_тура, inserted.Тип_отеля, inserted.Стоимость
from deleted LEFT JOIN inserted ON inserted.Номер_тура = deleted.Номер_тура
и добавить условие "у которых была изменена стоимость"
WHERE deleted.Стоимость <> inserted.Стоимость 

Далее, условие "не больше ли стоимость тура с мЕньшим кол-вом звезд, чем у другого тура" тоже нужно записать как WHERE EXISTS (вложенный):
WHERE EXISTS
(
    SELECT *
    FROM тур t
    WHERE  a.Стоимость > t.Стоимость and a.Тип_отеля < t.Тип_отеля
)

В итоге получится:

CREATE TRIGGER Триггер_b
ON Тур AFTER UPDATE
AS
--Если произошло изменение стоимости, то запускаем триггер
IF UPDATE(Стоимость)
BEGIN
IF EXISTS(
  --находим туры, у которых была изменена стоимость
  SELECT *
  FROM deleted d
      LEFT JOIN inserted i ON i.Номер_тура = d.Номер_тура
  WHERE d.Стоимость <> i.Стоимость 
  --  не больше ли стоимость тура с мЕньшим кол-вом звезд, чем у другого тура
  AND EXISTS
  (
      SELECT *
      FROM тур t
      WHERE  i.Стоимость > t.Стоимость and i.Тип_отеля < t.Тип_отеля
  )
)
BEGIN
    RAISERROR('Нельзя изменить стоимость тура!', 16, 1)
    ROLLBACK TRANSACTION
END
END
8 мар 17, 12:21    [20274143]     Ответить | Цитировать Сообщить модератору
 Re: Последующий триггер.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
alexeyvg
В итоге получится:

LEFT конечно не нужен
JOIN inserted i ON i.Номер_тура = d.Номер_тура
8 мар 17, 12:22    [20274145]     Ответить | Цитировать Сообщить модератору
 Re: Последующий триггер.  [new]
Alex767
Member

Откуда:
Сообщений: 17
alexeyvg, спасибо за ответ и пояснения!
8 мар 17, 20:24    [20275412]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить