SQL删除触发器无法正常工作

时间:2018-03-15 14:25:44

标签: sql sql-server database triggers sql-update

我有以下触发器

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

中存储了大量其他数据

2 个答案:

答案 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?