我创建了一个触发器,将列设置为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???
的问候。
答案 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
....
)
但是,通常您应该将事件记录为新记录,而不是更新现有列。您当前的设计会破坏信息。