Триггер с проблемой случая 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
,