SQL:触发器未执行

时间:2011-04-28 21:18:59

标签: sql sql-server sql-server-2008

当插入的时间少于GETDATE()

时,我创建了一个触发器,将数据类型time列的值设置为null
ALTER trigger [dbo].[NULL_TIME_TRIGGER]
  on [dbo].[Products]
  after insert
  as
  update Products
  set ParkingStartTime = NULL
  from Products
   join inserted i
     on i.ParkingStartTime  = Products.ParkingStartTime 
  where i.ParkingStartTime < CAST(GETDATE() AS TIME);

问题是当I select * From table记录仍然有时间而不是NULL时。

任何想法?

的问候。

4 个答案:

答案 0 :(得分:1)

我认为最后,您需要一个sql作业,只需查看并在时间条件小于getDate()时将时间设置为null

答案 1 :(得分:0)

我真诚地不知道你的触发器有什么问题,应该是AFAIK工作。

但这绝对是的方式。你似乎试图验证一些插入的值。如果是这种情况,您应该使用INSTEAD OF INSERT触发器,而不是AFTER INSERT,就像您目前正在做的那样。

所以它会是这样的:

ALTER trigger [dbo].[NULL_TIME_TRIGGER]
  on [dbo].[Products]
  instead of insert
  as
  begin
      insert into Products (
          field1, field2, ..., fieldn, ParkingStartTime
      ) select
          field1, field2, ..., fieldn,
          case when ParkingStartTime < CAST(GETDATE() AS TIME) then NULL else ParkingStartTime end
      from
          inserted
  end
  go

这样SQL Server将拦截Products表中的所有插入,并且只会在触发器内执行插入,从而修复ParkingStartTime值。因此,触发器不需要执行另一个更新来使它们正确。

希望它有所帮助。

答案 2 :(得分:0)

rsen娜有一个选择,它在许多方面都是优越的。以下是我将如何播放你的AFTER INSERT版本(asssume int as PK):

ALTER trigger [dbo].[NULL_TIME_TRIGGER]       
ON [dbo].[Products]       
AFTER INSERT       
AS

DECLARE @ID int

SELECT @ID = ID FROM INSERTED

UPDATE Products
SET ParkingStartTime = NULL
WHERE ID = @ID

答案 3 :(得分:0)

我有个主意,是的。插入行时,时间值大于当前时间,因此保持不变。当您检查表格的内容时,某些值已经超过了检查时的当前时间。