SQL 服务器更新触发器 - 破坏事物
SQL Server UPDATE Trigger - breaking things
我有一个更新语句,长话短说,每半分钟运行一次。此语句在 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)';
这部分效果很好,我更新这些专栏没有问题。每次运行它都会更新多行。
我有一个更新触发器,我正试图将其放在 table、dbo.MobileLeases
上。当 Building
列在 dbo.MobileLeases
中更新时,我想将一个 INSERT
执行到另一个 table、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
如您所见,当 (Building)
在 dbo.MobileLeases
上更新时,我正在尝试 INSERT INTO
dbo.LeaseAudit
,其中旧更新值 (d.Building
)与新值不同 (m.Building
).
我想我最大的问题是这个触发器是如何破坏初始更新查询的?触发器就位后,预定的更新语句将停止工作。当我移除触发器时,一切又恢复正常了。
感谢您的任何建议。
答案是 UPDATE
交易整体失败。
在 tableA 上配置的更新触发器旨在在更新 tableA.column1 时在 tableB 上插入新行。
插入语句包含 被 设置为 tableB 上的 PK 的列。很明显,insert语句无法在PK列中插入一个重复的值,所以整个update就炸了。
我的解决方案是从 tableB.PK 中删除 PK 属性。是审计table,应该不会错过
谢谢
我有一个更新语句,长话短说,每半分钟运行一次。此语句在 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)';
这部分效果很好,我更新这些专栏没有问题。每次运行它都会更新多行。
我有一个更新触发器,我正试图将其放在 table、dbo.MobileLeases
上。当 Building
列在 dbo.MobileLeases
中更新时,我想将一个 INSERT
执行到另一个 table、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
如您所见,当 (Building)
在 dbo.MobileLeases
上更新时,我正在尝试 INSERT INTO
dbo.LeaseAudit
,其中旧更新值 (d.Building
)与新值不同 (m.Building
).
我想我最大的问题是这个触发器是如何破坏初始更新查询的?触发器就位后,预定的更新语句将停止工作。当我移除触发器时,一切又恢复正常了。
感谢您的任何建议。
答案是 UPDATE
交易整体失败。
在 tableA 上配置的更新触发器旨在在更新 tableA.column1 时在 tableB 上插入新行。
插入语句包含 被 设置为 tableB 上的 PK 的列。很明显,insert语句无法在PK列中插入一个重复的值,所以整个update就炸了。
我的解决方案是从 tableB.PK 中删除 PK 属性。是审计table,应该不会错过
谢谢