仅允许 SQL Server 插入的当前日期/时间

Posted

技术标签:

【中文标题】仅允许 SQL Server 插入的当前日期/时间【英文标题】:Only allow current date/time on SQL Server insertion 【发布时间】:2016-04-07 15:21:52 【问题描述】:

我需要一种方法来仅在插入的字段(更准确地说是 DateTime 字段)中强制执行单个值,该字段应始终设置为插入时的当前日期/时间。 我正在做一个大学练习,他们希望所有的约束都在数据库中完成,通常我会设置一个 DEFAULT GetDate() 并始终在插入时使用 DEFAULT,但练习要求阻止了这一点。 现在对于一个整数,我可以这样做(我省略了其他字段,因为它们与手头的问题无关):

CREATE TABLE tester(
d INTEGER not null DEFAULT 3,
CONSTRAINT chkd CHECK(d = 3)
);

但是我想要的是以下内容:

CREATE TABLE tester(
d DATETIME not null DEFAULT GETDATE(),
CONSTRAINT chkd CHECK(d = ????????)
);

在 check() 中重新迭代 GetDate() 将触发插入错误,因为微秒会导致不匹配。 所以我想第一个问题是,这可能吗?如果是这样(我希望如此)怎么办?

【问题讨论】:

使用触发器用当前时间填充字段? @RyanVincent Right thx,不知道为什么我没有想到这一点,我在其他地方使用触发器,这样真的很简单。 【参考方案1】:

不要跟踪tester 表中的日期/时间。相反,有一个单独的表,其中有一列引用tester 表的 ID 作为外键约束。新表将具有另一列,DateTime 列。在插入tester 表时,可以触发一个触发器,该触发器将在新表中插入一行,其中包含新创建的tester 行的ID 以及当前日期/时间。

【讨论】:

Ryan 评论建议的不错扩展,虽然不需要单独的表,但可以让触发器直接作用于 tester 表 是的,我不确定您需要多少才能隔离该值并确保用户没有可以更改它的机制等等。【参考方案2】:

根据 Ryan 的评论,得到了这个有效的答案

CREATE TRIGGER trigger_date ON [dbo].[tester] 
FOR INSERT
AS
BEGIN
    UPDATE tester SET d = GETDATE() WHERE id IN (SELECT id FROM INSERTED);
END
GO

【讨论】:

以上是关于仅允许 SQL Server 插入的当前日期/时间的主要内容,如果未能解决你的问题,请参考以下文章

如何将当前日期和时间插入到具有 DateTime 类型列的 SQL Server 表中?

SQL Server:仅比较月份和日期 - SARGable

sql server 中如何插入一条时间记录

为啥 SQL Server 不允许我将 '21/04/17' 存储为日期?

SQL Server CE 中的正确日期时间格式?

Sql Server如何使用date数据类型将日期插入到列中