SQL Server中的DateCreated列?

问题描述 投票:7回答:5

是否有一种特殊的方法可以在MS Sql Server表中声明DateCreated列,以便在创建时自动用适当的时间戳填充该列?

或者..当我手动执行查询时,是否必须提供日期时间?

sql sql-server sql-server-2005 linq-to-sql datecreated
5个回答
16
投票

默认值有两个主要缺点。

  • 如果insert语句为该列指定一个值,则不使用默认值。
  • 该列可以随时更新。

这意味着您不能确定未在控件之外修改值。

如果要实现真正的数据完整性(以便确保行中的日期是创建日期),则需要使用触发器。

将列设置为当前日期的插入触发器和防止对该列进行更改的更新触发器(或更确切地说,将其设置为当前值)是实现DateCreated列的方法。

将列设置为当前日期的插入和更新触发器是实现DateModified列的方法。

(来自用户Gabriel的编辑-这是我按照描述的方法执行的尝试-我不是100%确信它是正确的,但我希望OP能够对其进行审查...):]]

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

    -- Get the current date.
    DECLARE @getDate DATETIME = GETDATE()

    -- Set the initial values of date_created and date_modified.
    UPDATE
        dbo.Affiliate
    SET 
         date_created = @getDate
    FROM
        dbo.Affiliate A 
        INNER JOIN INSERTED I ON A.id = I.id
        LEFT OUTER JOIN DELETED D ON I.id = D.id
    WHERE
        D.id IS NULL

    -- Ensure the value of date_created does never changes.
    -- Update the value of date_modified to the current date.
    UPDATE
        dbo.Affiliate
    SET
         date_created = D.date_created
        ,date_modified = @getDate
    FROM 
        dbo.Affiliate A 
        INNER JOIN INSERTED I ON A.id = I.id
        INNER JOIN DELETED D ON I.id = D.id 
END

11
投票

您可以将列的默认值设置为“ getdate()”


2
投票

我们在CreatedDate上具有默认值,并且不使用触发器执行


1
投票

当然是。


0
投票

设置默认值还不够,您应该添加触发器以防止更新:

© www.soinside.com 2019 - 2024. All rights reserved.