SQL:触发器将列设置为null

时间:2011-05-02 20:51:10

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

我创建了一个触发器,将列设置为null,其中列的值大于GETDATE()

ALTER TRIGGER [dbo].[Null_Time_Trigger3]

  on [dbo].[Parking]
  FOR insert
  as
  update Parking
  set Column = NULL
  from Parking
  where Column >= CAST(GETDATE () AS TIME)

它出现的时间超过触发器什么都没做?时间仍然在列中,并且列的值不是NULL

知道如何解决这个问题吗?

无论如何都要这样做(Setting the column to null) other than triggers???

的问候。

3 个答案:

答案 0 :(得分:3)

insert仅触发插入语句。如果没有insert操作,则您的触发器将无法运行。

由于你的触发器引用Parking表本身而不是inserted表,它可能对插入有效,但这完全不是触发器的用途。

SQL Server中没有时间触发器会自动NULL - 当时间过去时(如您可能期望的那样)列中的列。

您可以改为CASE WHEN Column < CAST(GETDATE () AS TIME) THEN Column END AS Column中的SELECT

答案 1 :(得分:0)

首先,我认为你应该使用&lt;在您的触发器定义中。无论如何,当您在数据库中插入新行并在该行上执行而不是之前的行时,此触发器将被触发 ONLY !!! 你可以用一个查询来做到这一点:

UPDATE Parking SET `Column`=NULL
WHERE `Column` < CAST(GETDATE () AS TIME)

已编辑:

CREATE TRIGGER [dbo].[Null_Time_Trigger4]
on [dbo].[Parking]
FOR INSERT,UPDATE
AS BEGIN
    UPDATE Parking SET `Column`=NULL
    WHERE `Column` < CAST(GETDATE () AS TIME)
END

答案 2 :(得分:0)

您可以添加计算列,如下所示:

CREATE TABLE
(
...
Column  DATETIME,
CurrentColumn  AS CASE WHEN DATETIME < SYSDATETIME() THEN DATETIME END
....
)

但是,通常您应该将事件记录为新记录,而不是更新现有列。您当前的设计会破坏信息。