Sql server 如果满足条件,SQL Server将触发在插入另一个表后更新表中的一个值
更新:为了消除一个可能的建议,我将第一个查询保存为视图,并在触发器中替换它。没有观察到行为上的变化。我已更新以下代码以反映新的安排。 我刚刚开始使用SQL Server触发器,并取得了一些成功。我目前正在做的工作让我感到困惑 我正在处理两张桌子。一个是订单标题,另一个包含行项目。触发器正在监视行项目表中插入的新行,如果添加的项目满足某些条件,则更新订单标题表中的值。当我分解查询并单独运行它时,我得到了我期望的结果。包含我正在关注的项目的订单列表Sql server 如果满足条件,SQL Server将触发在插入另一个表后更新表中的一个值,sql-server,triggers,multiple-tables,Sql Server,Triggers,Multiple Tables,更新:为了消除一个可能的建议,我将第一个查询保存为视图,并在触发器中替换它。没有观察到行为上的变化。我已更新以下代码以反映新的安排。 我刚刚开始使用SQL Server触发器,并取得了一些成功。我目前正在做的工作让我感到困惑 我正在处理两张桌子。一个是订单标题,另一个包含行项目。触发器正在监视行项目表中插入的新行,如果添加的项目满足某些条件,则更新订单标题表中的值。当我分解查询并单独运行它时,我得到了我期望的结果。包含我正在关注的项目的订单列表 --QUERY WORKS AS EXPECTED
--QUERY WORKS AS EXPECTED
SELECT ord_no, cmt_cd_1
FROM OrderHeader
WHERE ord_no IN
(SELECT DISTINCT OrderHeader.ord_no
FROM OrderLine INNER JOIN OrderHeader
ON OrderLine.ord_no = OrderHeader.ord_no
WHERE (OrderLine.item_no LIKE 'A%') OR
(OrderLine.item_no LIKE 'B%') OR
(OrderLine.item_no LIKE 'C30%'))
然而,当我尝试在触发器中使用它时,它不起作用
--TRIGGER DOES NOT UPDATE ANY RECORDS
CREATE TRIGGER add_cmt_cd
ON [OrderLine]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE OrderHeader
SET cmt_cd_1 = 'O'
FROM OrderHeader
INNER JOIN inserted ON OrderHeader.ord_no = inserted.ord_no
WHERE (OrderHeader.ord_no IN (SELECT OrderListView.ord_no
FROM OrderListView))
END
我已经验证了标题记录是首先创建的,并且在创建行项目记录之前确实存在。我在这个表上有另一个触发器工作正常,尽管它更新的值与触发器在同一个表中
--TRIGGER WORKS AS DESIGNED
CREATE TRIGGER add_line_cmt
ON [OrderLine]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE OrderLine
SET cmt_1 = 'Comment 1',
cmt_2 = 'Comment 2'
FROM OrderLine
INNER JOIN inserted ON inserted.ord_no = OrderLine.ord_no
WHERE (OrderLine.item_no IN (SELECT CAST(item_no AS CHAR) AS item
FROM ItemTable
WHERE (group = 3)))
END
我已经用头撞桌子三个小时了,我知道我错过了一些简单的事情。我希望在我发疯之前,其他人会发现它。不要把这件事具体化。改为创建一个视图,该视图选择标题列加上根据订单项目计算的特殊列。你说它不起作用是什么意思?我相信它正在更新,但不是您期望的值,对吗?dbo.POORDHDR_SQL与插入的相同吗?触发器是高度特定于供应商的-因此请添加一个标记以指定您是否正在使用
mysql
,postgresql
,SQL server
,oracle
或db2
-或其他完全不同的东西。@Jervs对缺乏细节表示抱歉。它根本不更新任何值。POORDHDR实际上是OrderHeader。我在清理发帖代码时漏掉了一个。