我非常接近得到答案,但我觉得我错过了最后一部分。
我已经创建了一个DELETE
触发器,该触发器应该从<{1}}语句中显示从表中删除之前的值。但是,当调用触发器时,我得到一个空白结果,但仍然从表中删除值(order_id = 10001 AND product_id = 25)。
我在运行触发器之前验证了SELECT
声明的有效性,因此我确信该部分是正确的。
我尝试过使用SELECT
触发器,但最终没有删除这些值。我不相信SQL Server有INSTEAD OF DELETE
函数吗?有工作吗?
建议?
BEFORE DELETE
答案 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