我正在制作一个包含姓名,电子邮件等的简单表格,但我也有一个ModifiedDate
。我的想法是在插入和更新后使用触发器,并插入当前日期。因此,如果任何人对该列做任何事情(除了删除),日期应该反映出来。
然而,这不起作用。
CREATE TRIGGER ModDate
ON X
AFTER INSERT, UPDATE
AS
BEGIN
INSERT INTO X (ModifiedDate)
VALUES (GETDATE())
END
现在我有几个不能为null的值,而这似乎是尝试创建一个新行。我希望它将日期插入当前正在执行的行中,我不知道如何。如果我一次添加5行怎么办?
答案 0 :(得分:8)
您需要在触发器中加入inserted
虚拟表,以将更新的行限制为实际更改的行。试试这个:
CREATE TRIGGER ModDate
ON TableX
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE X
SET ModifiedDate = GETDATE()
FROM TableX X
JOIN inserted i ON X.key = i.key -- change to whatever key identifies
-- the tuples
END
就像@ZoharPeled在下面的评论中正确指出的那样,触发器更新插入日期真的没什么意义 - 最好使用getdate()
作为列的默认值(或者甚至作为另一列InsertedDate
如果您想跟踪最初创建记录的时间,并且触发器仅在更新后修改ModifiedDate
列。
有关已插入和已删除表的详细信息,请参阅documentation。
答案 1 :(得分:0)
如果您没有插入数据上的键,并且您没有在sql的命令中在modifieddate列上添加默认值,则可以获取insertdit,其中modifieddate列为null:
CREATE TRIGGER ModDate
ON TableX
AFTER INSERT
AS
BEGIN
UPDATE tableX SET ModifiedDate = GETDATE() where modifieddate is null
END
答案 2 :(得分:0)
CREATE TRIGGER ModDate
ON TableX
FOR INSERT, UPDATE
AS
BEGIN
UPDATE TableX
SET ModifiedDate = GETDATE()
WHERE Id = (Select Id from Inserted)
END
答案 3 :(得分:-1)
表名: x
触发器名称: ModDate
在表格中插入或更新后更新的字段: ModifiedDate
create trigger [dbo].[ModDate] on [dbo].[x] after insert,update
as
begin
UPDATE dbo.x
SET x.ModifiedDate = GETDATE()
FROM x X
JOIN inserted I ON X.key = I.key
end