SQL Server UPDATE触发器 - 破坏事物

时间:2018-05-09 16:38:41

标签: sql-server database-trigger

我有一个UPDATE语句,长话短说,每半分钟运行一次。这个语句在Powershell中,所以不要介意变量语法...

UPDATE dbo.MobileLeases 
SET IPAddress = '$($l.IPAddress)', 
    OwnerName = '$($l.OwnerName)', 
    Building = '$($l.Building)', 
    TimeOn = '$($l.Time)', 
    LeaseExpiry = '$($l.LeaseExpiry)', 
    Phone = '$($l.Phone)', 
    OwnerEmail = '$($l.OwnerEmail)' 
WHERE PhysicalAddress = '$($l.DeviceID)';

这部分效果很好,我更新这些列没有问题。它每次运行时都会更新多行

我有一个更新触发器,我试图放在这个表dbo.MobileLeases上。在Building中更新dbo.MobileLeases列后,我想在另一个表INSERT中执行dbo.LeaseAudit

insert into似乎适用于触发器到位后的第一次更新。之后,预定的UPDATE语句(来自Powershell)停止工作!这对我来说很困惑,但这是触发器......

CREATE TRIGGER [dbo].[trigger_LeaseAudit] 
ON [dbo].[MobileLeases]
AFTER UPDATE 
AS
BEGIN
    SET NOCOUNT ON;

    IF UPDATE (Building)
    BEGIN
        INSERT INTO dbo.LeaseAudit(PhysicalAddress, DeviceName, OwnerName, Building, TimeOn, IPAddress)
           SELECT 
               i.PhysicalAddress, i.DeviceName, i.OwnerName, i.Building,
               i.TimeOn, i.IPAddress
           FROM
               MobileLeases AS m
           INNER JOIN 
               inserted AS i on m.PhysicalAddress = i.PhysicalAddress
           INNER JOIN 
               deleted AS d on m.PhysicalAddress = d.PhysicalAddress
           WHERE 
               m.Building <> d.Building
        END
END

正如您所看到的那样INSERT INTO dbo.LeaseAudit (Building)更新dbo.MobileLeases时,旧的更新值(d.Building)不同到新值(m.Building)。

我想我最大的问题是这个触发器如何打破初始更新查询?触发器就位后,预定的更新语句将停止工作。当我移除触发器时,一切都会再次起作用。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

答案是UPDATE交易整体失败。

tableA上配置的更新触发器用于在tableA.column1更新时在tableB上插入新行。

insert语句包含 在tableB上设置为PK的列。显然,insert语句无法在PK列中插入重复值,因此整个更新都是轰炸。

我的解决方案是从tableB.PK中删除PK属性。这是一张审计表,所以我不应该错过它。

谢谢