SQL:触发器未执行

SQL:触发器未执行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我创建了一个触发器,当插入的时间小于GETDATE()时,将数据类型time的列的值设置为null ALTER trigger[dbo].[NULL\u TIME\u trigger] 关于[dbo].[产品] 插入后 作为 更新产品 设置ParkingStartTime=NULL 来自产品 连接插入i 在i.ParkingStartTime=Products.ParkingStartTime上 其中i.ParkingStartTime

我创建了一个触发器,当插入的时间小于GETDATE()时,将数据类型time的列的值设置为null

ALTER trigger[dbo].[NULL\u TIME\u trigger]
关于[dbo].[产品]
插入后
作为
更新产品
设置ParkingStartTime=NULL
来自产品
连接插入i
在i.ParkingStartTime=Products.ParkingStartTime上
其中i.ParkingStartTime
问题是,当
I从表中选择*时,记录仍有时间,而不是
NULL

有什么想法吗


问候

我真的不知道你的触发器出了什么问题,应该能正常工作

但这绝对不是我们要走的路。您似乎正在尝试验证一些插入的值。如果是这种情况,您应该使用
而不是INSERT
触发器,而不是像您当前所做的那样在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
ALTER trigger[dbo].[NULL\u TIME\u trigger]
关于[dbo].[产品]
而不是插入
作为
开始
插入到产品中(
字段1,字段2,…,字段N,停车开始时间
)挑选
字段1,字段2,…,字段N,
当ParkingStartTime<强制转换(GETDATE()作为时间)时,则为NULL,否则ParkingStartTime结束
从…起
插入
结束
去
这样,SQL Server将截获
Products
表中的所有插入,并仅在触发器内执行插入,从而修复
ParkingStartTime
值。因此,触发器不需要执行另一个更新来使其正确


希望能有所帮助。

rsenna有一个选择,它在许多方面都很优越。以下是我将如何播放您的后插入版本(将int作为PK):


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

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

您在另一个问题中提到“ParkingStartTime”也是一个时间字段-不是这样吗?您确定您的条件为
?。我的意思是,
ParkingStartTime
?可以使用Products表的PK字段代替ParkingStartTime吗?(我在想有什么东西没有排好队)。另外,如果有许多行项目具有相同的parkingstarttime,该怎么办?第一个问题是,如果希望它为空,为什么应用程序会发送一个开始时间。@gregory:是的,但仅在该时间加入是错误的。如果字段是“time”,那么您可以使用他的触发器更新多行,我确信这不是故意的。标识字段在inserted中不可用吗?让我更清楚地说明一下,基本上用户是在特定时间预订停车位的。只要添加的时间小于
GETDATE(),就应该将时间添加到相应的数据库列中
然后它应该将记录重置为
NULL
以重新分配该停车场并使其可用again@HumamShbib:那么你是说
ParkingStartTime
应该设置为
NULL
,当它等于当前时间时?如果是这种情况,则不应将其作为
INSERT
触发器来实现。你担心的“事件”根本不是插入;这是一个时刻。@Humam Shbib:我会尽量说得更清楚些-我想你应该创造一个工作/服务。它将不时获取所有记录,并在大于或等于当前时间时将
ParkingStartTime
设置为
NULL
。操作员是
@Humam Shbib:好的,我想你是对的。但主要的一点是,我认为触发方法在这里不可行。据我所知,在插入过程中,该字段不会设置为
NULL
——只有经过一段时间后,才会设置为
NULL
。。。所以这里的主要问题是触发器方法是错误的(不管使用的是什么比较运算符)。这基本上是错误的方法来处理触发器中的“魔法”表,因为这样做就像插入的
inserted
总是只包含一行,而可以插入多行,像在
插入中一样…选择
。OP已经做对了,你可以简单地将你加入ID的想法应用到原始触发器上。(此外,你根本没有检查时间栏!)是的,我的想法是一样的,这就是为什么我要求查看数据:)同意。也可以在使用行时执行此操作。我的意思是,应用程序的某些部分必须使用时间列。因此,当需要再次检查/使用数据时,可以作为功能的一部分调用清理。
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
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