Начало » Использование СУБД » Microsoft SQL Server » Проблема с триггером или с условием (Помогите решить проблему с триггером) 
	
		
		
			| Проблема с триггером или с условием [сообщение #4149] | 
			Mon, 22 January 2024 16:09   | 
		 
		
			
				
				
				
					
						  
						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);    
Напишу еще раз. Я выполняю запрос. и он должен не выполнится. Т.к. разница между днем рождением и Датой приема на работу составляет всего 4 года, а пройти данное условие должно только от 22. Кто умный и сможет решить эту проблему, тому огромное спасибо. Грешу на то что SSMS сам по себе баганый. К примеру в нем сбивается автоинкремент в таблицах 
		
		
		
 |  
	| 
		
	 | 
 
 
 |  
	| 
		
 |  
	
		
		
			| Re: Проблема с триггером или с условием [сообщение #4302 является ответом на сообщение #4150] | 
			Wed, 31 January 2024 13:45   | 
		 
		
			
				
				
				
					
						  
						flexgen
						 Сообщений: 27 Зарегистрирован: July 2022 
						
					 | 
					Junior Member  | 
					 | 
		 
		 
	 | 
 
	
		С моей точки зрения сам подход вешать бизнес-логику на триггер - неправильный. Если необходимо - пиши процедуру и вызывай ее программно либо в самой аппликации высчитывай все что необходимо и выполняй вставку записи с уже подсчитанными и проверенными данными. 
 
А насчет Цитата:К примеру в нем сбивается автоинкремент в таблицах 
Не пояснишь как это? Я с таким что-то не сталкивался.
		
		
		
 |  
	| 
		
	 | 
 
 
 |   
Переход к форуму:
 
 Текущее время: Tue Nov 04 10:27:43 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.01003 секунд 
 |