所以我正在尝试构建一个简单的触发器,如果输入的信用卡日期已经过去,将导致弹出错误消息。如果卡片日期仍然很好,我希望它像往常一样更新或插入。我仍然很擅长处理SQL Server,并试图围绕如何正确设置事物的环境。我有一种感觉,我没有正确设置它,但任何建议将不胜感激。
该表包含,(CreditCardID(PK),CardType,CardNumber,ExpMonth,ExpYear,ModifiedDate
USE AdventureWorks2012
GO
CREATE TRIGGER BadCreditCardDate
ON Sales.CreditCard
INSTEAD OF UPDATE, INSERT
AS
Begin
DECLARE @ExpMonth tinyint,
@ExpYear smallint
SELECT @ExpMonth=ExpMonth, @ExpYear=ExpYear
FROM INSERTED
IF
@ExpMonth < MONTH(GETDATE())
AND
@ExpYear < YEAR(GETDATE())
RAISERROR ('The Credit Card you have entered has expired.' ,10,1)
ELSE
DECLARE @CreditCardID INT
INSERT INTO CreditCard (CardType, CardNumber, ExpMonth, ExpYear, ModifiedDate)
Select CardType, CardNumber, ExpMonth, ExpYear, ModifiedDate FROM inserted
WHERE CreditCardID = @CreditCardID
END
答案 0 :(得分:0)
首先,您的ELSE
条件仅适用于下一个DECLARE @CreditCardID INT
语句。您应该在整个BEGIN/END
区块周围使用ELSE
。
其次,如果您决定更新多行,则此触发器中的逻辑将失败,因为它只考虑一行更新。如果您需要从其他来源导入客户数据,则可能会发生这种情况。
第三。您应该分别处理UPDATES和INSERTS。我可能会考虑创建2个触发器,一个用于更新,另一个用于插入,只是为了避免代价高昂地确定发生了什么以及许多if和else逻辑。