【问题标题】:Only allow current date/time on SQL Server insertion仅允许 SQL Server 插入的当前日期/时间
【发布时间】: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,不知道为什么我没有想到这一点,我在其他地方使用触发器,这样真的很简单。

标签: sql-server default check-constraints getdate


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多