我正在尝试创建一个数据库触发器,当用户将数据插入表中时,该触发器将更新表的字段中的某些字符... 实施例
ID EXCHANGE LEADRT
1 new L-3
2 new 3
3 new 5
所以我想留下id 1,因为LEADRT的格式是正确的,但ID 2和3不是。
CREATE TRIGGER triggerupdate ON PoleUnits FOR INSERT,
UPDATE AS
if not exists (select * from Poleunits where LEADRT like '%L-%')
update PoleUnits set LEADRT = STUFF (LEADRT, 1, 0,'L-');
任何想法,为什么我不能让这个工作或更好的建议如何实现这一目标?
答案 0 :(得分:3)
在插入和更新触发器中,您可以访问名为inserted
的特定表,其中包含要插入/更新的行。这些不是真正的表,它们只是逻辑表,其结构与触发器触发的表相同。
您当前的逻辑工作在原始表上,因此可以处理所有现有数据,但不能处理您实际插入的数据,即它将更新除实际要更新的数据之外的所有数据。这样的事情可以奏效:
CREATE TRIGGER triggerupdate ON PoleUnits
FOR INSERT, UPDATE AS
update PoleUnits
set LEADRT = STUFF (PoleUnits.LEADRT, 1, 0,'L-')
from PoleUnits
inner join inserted -- this is basically a self join
on PoleUnits.ID = inserted.ID
where PoleUnits.LEADRT not like '%L-%'
这将仅更新正在插入的PoleUnits中的那些行,并且仅当它们的LEADRT字段不是L-格式时才会更新。