【问题标题】:Instead of delete TRIGGER preventing delete on selling products而不是删除触发器防止删除销售产品
【发布时间】:2016-11-30 21:35:45
【问题描述】:

我的问题是我需要创建一个而不是删除触发器,以防止在过去两年内销售过的产品被删除。否则,它应该与产品的所有订单行一起删除。

我的表格如下所示:

PRODUCT_TABLE: ID, price
ORDERITEM_TABLE: ID, Quantity, productid, ordersid
ORDERS_TABLE: ID, Orderdate 

这是我的第一个触发器,所以我现在很无能,但有一个想法可以做这样的事情:

CREATE TRIGGER productdelete
ON product
INSTEAD OF DELETE
AS 
BEGIN
DECLARE @today datetime, @orderdate date 
SET @today = GetDate()
IF NOT EXISTS(SELECT productid from product where productid = (select productid from deleted) and (SELECT orderdate from orders) > (SELECT  DATEADD(YEAR, -2, @today)))
    raiserror ('Unable to delete', 16,1)
    rollback tran
END

触发器将在表中没有的任何 productid 上触发。

有人有什么建议吗?

【问题讨论】:

  • 你不是今天早些时候发布了这个问题吗?我知道我今天早些时候看到了这个确切的问题。您的条件逻辑不正确。它需要将 Order 表中的 OrderDate 与今天的日期进行比较。

标签: sql sql-server tsql triggers


【解决方案1】:

由于您使用的是 INSTEAD OF 触发器,因此无需回滚事务。

如果条件允许,只需在触发代码中执行 DELETE,否则不执行任何操作。

【讨论】:

    【解决方案2】:

    触发器在隐式事务下运行。

    CREATE TRIGGER productdelete
    ON product
    INSTEAD OF DELETE
    AS 
    BEGIN
    
        IF EXISTS(SELECT NULL from deleted) and ..
           raiserror ('Unable to delete', 16,1)
        ELSE IF
          delete from yourtable where xx in (select yy from deleted)
    
    END
    

    【讨论】:

      猜你喜欢
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      相关资源
      最近更新 更多