Триггер с проблемой случая RAISERROR и ELSE

Я пытаюсь сделать немного кода, который занимает 2 отдельных столбца, месяц и год. Оттуда я хочу видеть, прошли ли уже введенные числа или нет. Если они прошли, вызовите ошибку, чтобы пройти и остановить транзакцию. В противном случае я хочу, чтобы он продолжался и вставлял новую информацию в таблицу. Я знаю, что я близок к тому, чтобы заставить это работать, но я не могу заставить РЕЙЗЕРРОРА стрелять. Я уверен, что это связано с тем, что я довольно новичок в этом, и мне не хватает некоторых мелких деталей.

В настоящее время я беру два месяца в качестве переменных и создаю третью переменную, чтобы использовать ее для преобразования двух других в надлежащий формат даты и времени. Затем я использую функцию datediff, чтобы попытаться проверить, прошел ли он этот путь. Но безрезультатно. Я продолжаю получать функцию вставки, даже если дата карты старая.

USE AdventureWorks2012
GO

CREATE TRIGGER BadCreditCardDate
ON Sales.CreditCard
INSTEAD OF INSERT
AS
Begin
DECLARE @ExpMonth tinyint,
        @ExpYear smallint,
        @ExpMonthYear datetime

SELECT  @ExpMonth=ExpMonth, 
        @ExpYear=ExpYear,
        @ExpMonthYear = @ExpYear + '-' + @ExpMonth + '-00' 
FROM INSERTED
    IF
    DATEDIFF(MONTH,@ExpMonthYear,GETDATE()) < 0
    BEGIN
        RAISERROR ('The Credit Card you have entered has expired.' ,10,1)
        ROLLBACK TRANSACTION
    END 

ELSE    
Begin
    INSERT INTO CreditCard (CardType, CardNumber, ExpMonth, ExpYear, ModifiedDate)
    Select CardType, CardNumber, ExpMonth, ExpYear, ModifiedDate FROM inserted
END
End

1 ответ

Решение

Я думаю, что есть более простой способ проверить срок действия:

CREATE TRIGGER BadCreditCardDate
ON Sales.CreditCard
INSTEAD OF INSERT
AS
BEGIN
   IF EXISTS (
      SELECT 1
      FROM inserted
      WHERE (YEAR(GETDATE()) > ExpYear) OR (YEAR(GETDATE()) = ExpYear AND MONTH(GETDATE()) > ExpMonth)
   )
   BEGIN
      RAISERROR ('The Credit Card you have entered has expired.' ,10,1)
      ROLLBACK TRANSACTION
   END 
   ELSE    
      BEGIN
         INSERT INTO CreditCard (CardType, CardNumber, ExpMonth, ExpYear, ModifiedDate)
         SELECT CardType, CardNumber, ExpMonth, ExpYear, ModifiedDate 
         FROM inserted
   END    
END

Таким образом, вы эффективно проверяете каждую запись, которая будет вставлена ​​в CreditCard,

Другие вопросы по тегам