使用INSTEAD OF的TSQL触发器

时间:2015-01-24 01:01:05

标签: sql-server tsql triggers

所以我正在尝试构建一个简单的触发器,如果​​输入的信用卡日期已经过去,将导致弹出错误消息。如果卡片日期仍然很好,我希望它像往常一样更新或插入。我仍然很擅长处理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

1 个答案:

答案 0 :(得分:0)

首先,您的ELSE条件仅适用于下一个DECLARE @CreditCardID INT语句。您应该在整个BEGIN/END区块周围使用ELSE

其次,如果您决定更新多行,则此触发器中的逻辑将失败,因为它只考虑一行更新。如果您需要从其他来源导入客户数据,则可能会发生这种情况。

第三。您应该分别处理UPDATES和INSERTS。我可能会考虑创建2个触发器,一个用于更新,另一个用于插入,只是为了避免代价高昂地确定发生了什么以及许多if和else逻辑。