代码之家  ›  专栏  ›  技术社区  ›  Elizabeth

SQL删除触发器不工作

  •  1
  • Elizabeth  · 技术社区  · 7 年前

    我有以下触发器

    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\u box\u命名 插入触发器使用与上述更新相同的更新代码进行状态更新 used_customer_no 对于保存此帐户的客户,没有问题。

    在非常罕见的情况下,我们需要执行相反的操作,在删除时执行相同的逻辑并更新 used\u customer\u编号 返回NULL以释放它。

    连接的原因是因为它是这样构建的--数据来自 lt\U设施\U参考 并与大量其他数据一起存储在 lt\u box\u命名

    2 回复  |  直到 7 年前
        1
  •  3
  •   Brian    7 年前

    具有 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))  
    
        2
  •  1
  •   Nik Shenoy    7 年前

    似乎删除触发器位于lt\u box\u naming上,而UPDATE语句JOIN也位于该表上。由于此触发器位于DELETE之后,因此该行将不存在。

    是否可以删除UPDATE语句中对LT\u BOX\u命名的引用,并使用 已删除 要加入lt\U facility\u ref的行?