【问题标题】:Trigger with a RAISERROR and ELSE case issue触发 RAISERROR 和 ELSE 案例问题
【发布时间】:2015-01-25 18:52:34
【问题描述】:

我正在尝试编写一些包含 2 个单独列(一个月和一年)的代码。从那里我希望它查看输入的这些数字是否已经通过。如果它们已经通过,则导致错误通过并停止事务。否则,我希望它继续并在表中插入新信息。我知道我快要让它工作了,但我似乎无法触发 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

【问题讨论】:

  • 您的触发器有 MAJOR 缺陷,因为您似乎认为它会每行调用一次 - 那是不是 b> 情况。触发器将每个语句触发一次,因此如果您的 UPDATE 语句影响 25 行,您将触发触发器一次,然后是 Inserted 和 @987654324 @ 每个将包含 25 行。您的代码将在这 25 行中选择哪一行? SELECT @ExpMonth = ExpMonth FROM Inserted - 这是不确定的。您需要重写触发器以考虑到这一点!
  • 您有一个硬编码的“00”作为到期日。如果表达式不为空,我希望 DATEDIFF 失败。

标签: sql-server triggers datediff raiserror


【解决方案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 中的每条 记录。

【讨论】:

  • 这就像一个魅力。我将不得不查看这段代码,看看它是如何工作的,然后记住这个小美。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2013-08-15
  • 2016-08-04
  • 2019-01-23
  • 1970-01-01
相关资源
最近更新 更多