SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Microsoft SQL Server » Проблема с триггером или с условием (Помогите решить проблему с триггером)
Проблема с триггером или с условием [сообщение #4149] Mon, 22 January 2024 16:09 Переход к следующему сообщению
LogDogz в настоящее время не в онлайне  LogDogz
Сообщений: 1
Зарегистрирован: January 2024
Junior Member
Короче. Проблема заключается в том что условие проверки расчета даты не работает. Оно просто игнорируется (я новичек в проектировании БД, по этому не бейте)
В чем собственно проблема? Давайте покажу код триггера: Само условие где у меня проблема, я выделил жирным. Там где запрос, который проходит, игрорируя первое уловие, но проходя второе я выделил нижней чертой и смайликом

CREATE TRIGGER UpdateSalary
ON Рез_Преподаватели
INSTEAD OF INSERT
AS
BEGIN
   

   DECLARE @Код_Преподавателя INT
   DECLARE @Ставка_Зарплаты INT
   DECLARE @Надбавка_к_Зарплате INT
   DECLARE @Код_кафедры INT
   DECLARE @Фамилия_Преподавателя VARCHAR(50)
   DECLARE @Должность VARCHAR(50)
   DECLARE @Научное_Звание VARCHAR(50)
   DECLARE @Дата_приема_на_работу DATE
   DECLARE @День_Рождения DATE
   DECLARE @Идентификационный_Код INT

   SELECT
       @Код_Преподавателя = i.Код_Преподавателя,
       @Ставка_Зарплаты = i.Ставка_Зарплаты,
       @Надбавка_к_Зарплате = i.Надбавка_к_Зарплате,
       @Код_кафедры = i.Код_кафедры,
       @Фамилия_Преподавателя = i.Фамилия_Преподавателя,
       @Должность = i.Должность,
       @Научное_Звание = i.Научное_Звание,
       @Дата_приема_на_работу = i.Дата_приема_на_работу,
       @День_Рождения = i.День_Рождения,
       @Идентификационный_Код = i.Идентификационный_Код
   FROM inserted i;
   BEGIN
   SET NOCOUNT ON;
IF ((DATEDIFF(YEAR,  @Дата_приема_на_работу, @День_Рождения)) >= 22 )

        BEGIN
           INSERT INTO Рез_Преподаватели (Код_Преподавателя, Ставка_Зарплаты, Надбавка_к_Зарплате, Должность, Код_кафедры, Фамилия_Преподавателя, Научное_Звание, Дата_приема_на_работу, День_Рождения, Идентификационный_Код)
           VALUES (@Код_Преподавателя, @Ставка_Зарплаты, @Надбавка_к_Зарплате, @Должность, @Код_кафедры, @Фамилия_Преподавателя, @Научное_Звание, @Дата_приема_на_работу, @День_Рождения, @Идентификационный_Код);
PRINT 'Разница в годах: ' + CAST(DATEDIFF(YEAR, @День_Рождения, @Дата_приема_на_работу) AS VARCHAR(20));
PRINT 'Разница в годах: ' + CAST(YEAR(@Дата_приема_на_работу) - YEAR(@День_Рождения) - CASE WHEN MONTH(@Дата_приема_на_работу) * 100 + DAY(@Дата_приема_на_работу) < MONTH(@День_Рождения) * 100 + DAY(@День_Рождения) THEN 1 ELSE 0 END AS VARCHAR(20));

       END
       IF @Ставка_Зарплаты >= @Надбавка_к_Зарплате * 2
       BEGIN
           INSERT INTO Рез_Преподаватели (Код_Преподавателя, Ставка_Зарплаты, Надбавка_к_Зарплате, Должность, Код_кафедры, Фамилия_Преподавателя, Научное_Звание, Дата_приема_на_работу, День_Рождения, Идентификационный_Код)
           VALUES (@Код_Преподавателя, @Ставка_Зарплаты, @Надбавка_к_Зарплате, @Должность, @Код_кафедры, @Фамилия_Преподавателя, @Научное_Звание, @Дата_приема_на_работу, @День_Рождения, @Идентификационный_Код);

       END

       ELSE
       BEGIN
           PRINT 'Ошибка: Ставка зарплаты не больше чем Надбавка в 2 раза или Работнику менее 22 лет';
           ROLLBACK transaction;
       END
   END
END

Запрос:

INSERT INTO Рез_Преподаватели (Код_Преподавателя, Ставка_Зарплаты, Надбавка_к_Зарплате, Должность, Код_кафедры, Фамилия_Преподавателя, Научное_Звание, Дата_приема_на_работу, День_Рождения, Идентификационный_Код)
VALUES (10000, 1001, 500,'доцент', 1, 'Семенихин', 'к.т.н', '2004-10-10', '2000-03-10', 873628934);
Evil or Very Mad
Напишу еще раз. Я выполняю запрос. и он должен не выполнится. Т.к. разница между днем рождением и Датой приема на работу составляет всего 4 года, а пройти данное условие должно только от 22. Кто умный и сможет решить эту проблему, тому огромное спасибо. Грешу на то что SSMS сам по себе баганый. К примеру в нем сбивается автоинкремент в таблицах
Re: Проблема с триггером или с условием [сообщение #4150 является ответом на сообщение #4149] Mon, 22 January 2024 17:46 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 294
Зарегистрирован: June 2022
Senior Member
Что здесь у тебя получается:
DECLARE @Дата_приема_на_работу DATE
DECLARE @День_Рождения DATE
       
SET  @Дата_приема_на_работу = '2004-10-10'
SET  @День_Рождения = '2000-03-10'
       
Select DATEDIFF(YEAR,  @Дата_приема_на_работу, @День_Рождения)

Залогируй значения переменных  @Дата_приема_на_работу, @День_Рождения в триггере.
И тогда поймешь что не так.
Re: Проблема с триггером или с условием [сообщение #4302 является ответом на сообщение #4150] Wed, 31 January 2024 13:45 Переход к предыдущему сообщению
flexgen в настоящее время не в онлайне  flexgen
Сообщений: 10
Зарегистрирован: July 2022
Junior Member
С моей точки зрения сам подход вешать бизнес-логику на триггер - неправильный. Если необходимо - пиши процедуру и вызывай ее программно либо в самой аппликации высчитывай все что необходимо и выполняй вставку записи с уже подсчитанными и проверенными данными.

А насчет Цитата:
К примеру в нем сбивается автоинкремент в таблицах
Не пояснишь как это? Я с таким что-то не сталкивался.
Предыдущая тема: вызов функции из прилинкованного сервера
Следующая тема: Поменять местами столбики с условием и сортировкой
Переход к форуму:
  


Текущее время: Sat Apr 27 09:19:12 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00599 секунд