使用 RAISERROR 和 ELSE 案例问题触发
Trigger with a RAISERROR and ELSE case issue
我正在尝试制作一些包含 2 个单独列(一个月和一年)的代码。从那里我想让它看看输入的那些数字是否已经通过。如果它们已通过,则导致错误通过并停止事务。否则,我希望它继续并将新信息插入 table。我知道我快要让它工作了,但我似乎无法让 RAISERROR 启动。我确信这与我在这方面很新而且我遗漏了一些小细节这一事实有关。
目前我将这两个月作为变量,并制作第三个变量用于将其他两个月转换为正确的日期时间格式。然后我使用 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
我认为有一种更简单的方法来检查过期:
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
。
我正在尝试制作一些包含 2 个单独列(一个月和一年)的代码。从那里我想让它看看输入的那些数字是否已经通过。如果它们已通过,则导致错误通过并停止事务。否则,我希望它继续并将新信息插入 table。我知道我快要让它工作了,但我似乎无法让 RAISERROR 启动。我确信这与我在这方面很新而且我遗漏了一些小细节这一事实有关。
目前我将这两个月作为变量,并制作第三个变量用于将其他两个月转换为正确的日期时间格式。然后我使用 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
我认为有一种更简单的方法来检查过期:
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
。