我有以下触发器
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[TG_LT_box_name_delete]
ON [dbo].[lt_box_naming]
AFTER DELETE
AS
Set NoCount On
update a
set used_customer_no = NULL
-- select a.* , '' as '||||', b.*
from lt_facility_ref a
join LT_BOX_NAMING b on b.location = ((a.facility) + '/' + a.zone + '-' + a.row_box + '-' + convert(varchar,a.seat))
JOIN deleted i ON b.id_key = i.id_key
它有点混乱的触发器。
我有三个表,一个主表lt_box_naming
,用于插入和更新存储数据和修改字段。它有一个位置字段,位置字段是另一个表lt_facility_ref
中几个字段的组合
数据看起来像这样
this is lt_facility_ref
facility zone row_box seat seat_no used_customer_no
PRK Balcony B 33 17559 8626324
PRK Balcony B 34 15889 NULL
PRK Balcony B 35 17558 8626324
WZO Orchestra D 6 15890 NULL
WZO Orchestra D 7 17557 3147711
this is lt_facility_ref
id_key customer_no type location seat_no
1 8626324 I PRK/Balcony-A-1 17512
2 8626324 I PRK/Orchestra-B-101 8527
3 3147711 C PRK/CenterHouse-B-23 8526
4 1235878 I WZO/TopTier-EE-1 12222
当记录插入lt_box_naming
时,插入触发器使用与上述相同的更新代码进行更新used_customer_no
更新used_customer_no
给客户no此帐户的保存位置并且无问题。
在极少数情况下我们需要反向执行,在删除时执行相同的逻辑并将lt_facility_ref
更新回NULL以将其释放。
加入的原因是因为它是这样构建的 - 数据来自lt_box_naming
,并在tr
答案 0 :(得分:3)
使用AFTER DELETE
记录已经消失,因此您无法在联接中使用它。您可以使用已引用的DELETED
代替。
update a
set used_customer_no = NULL
-- select a.* , '' as '||||', b.*
from lt_facility_ref a
JOIN deleted i ON i.location = ((a.facility) + '/' + a.zone + '-' + a.row_box + '-' + convert(varchar,a.seat))
答案 1 :(得分:1)
似乎删除触发器在lt_box_naming上,你的UPDATE语句JOIN也在该表上。由于此触发器是AFTER DELETE,因此该行不存在。
您是否可以删除UPDATE语句中对LT_BOX_NAMING的引用,并使用已删除行中的数据加入lt_facility_ref?