插入触发器将无法正常工作

时间:2012-12-21 20:48:02

标签: sql sql-server triggers sql-update

我正在尝试创建一个数据库触发器,当用户将数据插入表中时,该触发器将更新表的字段中的某些字符... 实施例

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-');  

任何想法,为什么我不能让这个工作或更好的建议如何实现这一目标?

1 个答案:

答案 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-格式时才会更新。