【问题标题】:Trigger for both insert and update插入和更新的触发器
【发布时间】:2019-12-09 16:26:58
【问题描述】:

我正在尝试创建一个触发器,如果​​金额大于 products 表中的数量,则该触发器将阻止用户插入或更新我的 orderLines 表中的数量。

有没有办法在单个触发器中执行此操作,还是我必须为插入和更新操作创建单独的触发器?

以下是我的触发器的启动方式:

CREATE TRIGGER OrdersLines_ITrig
ON ordersLines
FOR INSERT
AS

【问题讨论】:

    标签: sql-server triggers


    【解决方案1】:

    取决于BEGIN/END 块:

    触发器有特殊的INSERTEDDELETED 表来跟踪“之前”和“之后”数据。所以你可以使用IF EXISTS (SELECT * FROM DELETED) 之类的东西来检测更新。 DELETED 更新时只有行,但INSERTED 中始终有行。

    CREATE TRIGGER dbo.TriggerName
    ON dbo.TableName
    AFTER INSERT, UPDATE
    AS 
    BEGIN
        SET NOCOUNT ON;
        IF EXISTS (SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)
        BEGIN     
          ----Do update
        END;
    
        IF EXISTS (SELECT * FROM Inserted) AND NOT EXISTS (SELECT * FROM deleted)
        BEGIN
          -----Do insert
        END;
    END
    

    【讨论】:

      【解决方案2】:

      这是一个简单的要求,您可以使用 CHECK CONSTRAINT 本身来处理。如果要定义触发器,则必须正确回滚事务。有适当的错误消息等。你可以简单地有一个检查约束,它将为你做所有这些事情。

      我建议您执行以下步骤:

      1. 根据 Product 表中的数量创建一个用户定义的函数,该函数返回 TRUE 或 FALSE。
      CREATE FUNCTION CheckQuantity(@productID INT)
          RETURNS BIT
          AS
          BEGIN
          ---LOGIC 
          END
      
      1. 在 CHECK 约束中利用用户定义的函数。
      ALTER TABLE OrderLines ADD CONSTRAINT CHK_Quantity CHECK( dbo.CheckQuantity(ProductId) = = 1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-08
        • 2016-10-13
        • 1970-01-01
        相关资源
        最近更新 更多