SQL Server中的自动更新时间

时间:2012-01-04 14:42:06

标签: sql-server tsql entity-framework auto-update

我希望在表格中有两列来存储添加时间和更新时间。顾名思义,添加时间是首次添加行的时间;更新时间是更新行的最后时间。我可以先通过默认值GETDATE()来实现。至于第二个,@ Jeremy建议在这里使用触发器:

On Update: Auto Update Date/Time Field

  1. 有没有更简单的方法?
  2. 如果我实现了一个触发器,这是否意味着必须执行两个UPDATE语句(或者一个INSERT和一个UPDATE,以防刚刚创建该行)?
  3. 感谢。

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

    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是否足够智能以识别我正在更新同一记录并同时保存这两个更改?

6 个答案:

答案 0 :(得分:2)

  1. 您可以确保所有插入和更新都通过插入时间的存储过程。
  2. 不,插入触发器将修改值,使其只有一个语句。
  3. 编辑:对于实体框架,您可以实现OnSavingChanges事件以插入更新时字段(see here)吗?这将责任从数据库转移到您可能会或可能不习惯的代码。

答案 1 :(得分:2)

  1. 其他方式:

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

  2. 您需要一个UPDATE触发器,它本身还有一个UPDATE。使用表上的默认值意味着您不需要INSERT

  3. 的触发器

答案 2 :(得分:1)

以下是a link,其中显示了如何使用Entity Framework执行此操作。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

2)SQL Server有一个(相对较新的)“merge”语句。但这听起来并不像你想要的那样。

3)相反:

a)如果主键不存在(如果是“new”),则INSERT。在这种情况下,第一次=最后一次= GETDATE()。

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

4)也许您可以将此逻辑包装在存储过程中?

5)再次 - 关键是更新 BOTH “第一次”和“上次*,第一次,然后再更新 “上次”所有SUBSEQUENT次。

答案 5 :(得分:0)

  1. 它们可能是一种更简单的方法,但是使用触发器会更有效,并且无法保证记录是如何记录或更新的(从.net代码或直接表插入/更新),这两个字段是填充的

  2. 保证每次只触发一个触发器,组合插入和更新触发器

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

    并进行条件检查以区分两个动作

     IF UPDATE