3

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

ID  EXCHANGE   LEADRT
1    new         L-3
2    new         3
3    new         5

所以我想单独留下 id 1,因为 LEADRT 的格式是正确的,但 ids 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-');  

有什么想法为什么我不能让它工作或关于如何完成这个的更好的建议?

4

1 回答 1

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 格式时。

于 2012-12-21T20:56:14.963 回答