删除SQL Server之前显示结果

时间:2017-11-24 17:12:47

标签: sql-server triggers

我非常接近得到答案,但我觉得我错过了最后一部分。

我已经创建了一个DELETE触发器,该触发器应该从<{1}}语句中显示从表中删除之前的值。但是,当调用触发器时,我得到一个空白结果,但仍然从表中删除值(order_id = 10001 AND product_id = 25)。

我在运行触发器之前验证了SELECT声明的有效性,因此我确信该部分是正确的。

我尝试过使用SELECT触发器,但最终没有删除这些值。我不相信SQL Server有INSTEAD OF DELETE函数吗?有工作吗?

建议?

BEFORE DELETE

3 个答案:

答案 0 :(得分:1)

@JoeC - 使用proc可能是最好的答案。

如果必须使用触发器,则记住它必须编码为支持集。如果有人执行delete order_details where order_id = 10001,那么您的触发器将需要返回订单中每件商品的库存水平。

此外,在对触发器进行编码时,您可以访问名为deleted的内置表。该表包含已删除的记录。

所以你可以这样做:

CREATE TRIGGER deleteOrderTrigger
ON order_details
FOR DELETE
AS

INSERT INTO deleted_order_products_log

SELECT order_details.product_id
      ,products.name
      ,[Quantity being deleted from order] = order_details.quantity
      ,[In Stock Quantity after Deletion] = SUM(products.quantity_in_stock) + order_details.quantity
  FROM order_details
    INNER JOIN deleted d
        ON order_details.primaryKey = d.primaryKey
      LEFT JOIN products
          ON products.product_id = order_details.product_id
 GROUP BY order_details.product_id
         ,products.name
         ,order_details.quantity;

然后,您可以查询日志文件以获取计算结果。

答案 1 :(得分:0)

将触发器结果放入审计表中,您将看到触发器的结果。我从未见过类似于你的where子句的触发器。 执行表x中的插入选择....您还希望使用已删除的表(有一个插入的表),该表仅为每次出现的触发器创建,该触发器将包含刚刚删除的任何/所有行。删除发生在代码的主体中。然后调用触发器并删除表(您可以仅在触发器中执行删除*),该表将包含已删除的行。

答案 2 :(得分:0)

我没有经常使用触发器,但似乎你有一个AFTER触发器,它无法读取已删除的行,这就是你得到空白结果的原因。

带触发器的东西是插入和删除的表,也许这会有所帮助:https://docs.microsoft.com/en-us/sql/relational-databases/triggers/use-the-inserted-and-deleted-tables

如上所述,您需要一个INSTEAD OF触发器,但您必须自己执行删除操作。有关此主题的更多信息,请访问:https://docs.microsoft.com/en-us/sql/relational-databases/triggers/dml-triggers,此处有一个示例:https://stackoverflow.com/a/3267726/5605866