2012-01-04 775 views
1

我希望我的表中有两列用于存储添加时间和更新时间。顾名思义,添加时间是一行首次添加的时间;更新时间是行更新的最后一次。我可以通过默认值GETDATE()来执行。SQL Server中的自动更新时间

On Update: Auto Update Date/Time Field

  1. 有没有更简单的方法:对于第二个,@Jeremy这里使用触发器建议?
  2. 如果我实现了一个触发器,这是否意味着两个UPDATE语句(或一个INSERT和一个UPDATE,以防万一行刚刚创建)必须执行?

谢谢。

编辑:对于问题的第二部分,这是触发我在我的数据库:

CREATE TRIGGER [dbo].[TR_AddUpdateTime] 
    ON [dbo].[AddUpdateTime] 
    AFTER UPDATE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for trigger here 

    UPDATE r 
     SET UpdateTime = GETDATE() 
     FROM AddUpdateTime r 
     JOIN inserted i 
     ON i.Id = r.Id 
END 

这是否意味着额外的更新语句将被执行,每当我做一个更新AddUpdateTime表或MSSQL足够聪明,可以识别出我正在更新相同的记录并同时保存这两个更改?

+0

你是否总是通过存储过程更新/插入?你可以得到这个插入时间。 – Ray 2012-01-04 14:44:08

+0

不,我正在使用实体框架。 – Rafid 2012-01-04 14:44:53

+0

我编辑了我的答案,为实体框架提供了一个选项。 – Ray 2012-01-04 15:02:06

回答

2
  1. 您可以确保所有插入和更新都通过插入时间的存储过程。
  2. 不,插入触发器将修改值,以便它只有一个语句。

编辑:对于实体框架,你可以实现的OnSavingChanges事件插入更新时间字段(see here)?这是将责任从数据库转移到您可能会或可能不会感到满意的代码。

+0

所以似乎有些混乱。你说这个触发器不会导致额外的UPDATE语句被执行,但这与@gbn所说的相反! – Rafid 2012-01-05 11:28:07

+0

我编辑了我的问题,以查看我添加到数据库的触发器。 – Rafid 2012-01-05 11:31:17

0

1)“自动更新”和“触发器”听起来并不像要走的路。

2)SQL Server有一个(相对较新的)“合并”语句。但是,这听起来不像你要找的东西。

3)相反:

a)如果主键不存在(如果 “新”),然后插入。在这种情况下,第一次=上次= GETDATE()。

b)否则,如果主键已经存在,则更新。您的更新只会更新“上次”列(以及您需要为此记录更新的其余字段)。

也许您可以将此逻辑封装到存储过程中?

5)再次 - 关键是要更新BOTH“第一时间”和“最后一次*,该首次,然后更新ONLY‘最后一次’的所有后续倍。

+0

嗯,我想我的记录自动更新,而不必编写存储过程,因为我使用实体框架,我不知道如何让Entity Framework使用我的存储过程来插入/更新记录。 – Rafid 2012-01-04 14:52:23

2
  1. 其他方式:

    • 使用存储过程来包装更新
    • 你可以做UPDATE MyTable SET ..., UpdatedWhen = DEFAULT...

  2. 你需要一个UPDATE触发器本身具有一个更新。使用上表中的默认意味着你并不需要一个触发INSERT

+0

正如我在@ paulsm4的回答中所提到的,我不想使用存储过程。我也不想在我想更新记录时手动设置UpdateTime,因为我希望解决方案是通用的,以便在许多表中使用它。 – Rafid 2012-01-04 14:55:05

+0

至于你的第二条评论,我只使用了添加时间的默认值,因为它仅在第一次创建记录时进行设置。但是,每当我对记录进行任何更改时,更新时间都需要更新。 – Rafid 2012-01-04 14:56:01

+0

@Promather:您可以在更新中使用DEFAULT关键字来设置它。所以如果默认值是GETDATE(),那么UpdatedWhen将*更新*为最新日期。即使使用触发器,这也意味着GETDATE仅在约束中提及:不在代码中。 – gbn 2012-01-04 14:59:47

1

这里的a link说明了如何使用实体框架来做到这一点。

0
  1. 他们可能是一个更简单的方法,但使用触发器将更加有效,并保证没有母校如何记录inseted或更新(从.NET代码或直接表的插入/更新),这两个字段将被填充

  2. 出示担保,只有一个触发一次比一次发射,结合INSERT和UPDATE触发器

    CREATE TRIGGER <trigger name> ON TableA for INSERT,UPDATE 
    

    ,做条件检查两个动作之间进行区分

    IF UPDATE 
    
1

在实体框架中,您可以使用部分类来扩展业务逻辑。在这种情况下,您可以使用OnPropertyChanged将更新时间设置为DateTime.Now。您可以使用这个article on MSDN作为指导。