SQL Server防止对列进行更新数据库在插入时设置的datetime2列值

问题描述

我有一个Values,其中有3列:

CREATE TABLE [dbo].[Values]
(
    [Id] [uniqueidentifier] NOT NULL,[Value] [nvarchar](150) NOT NULL,[CreatedOnUtc] [datatime2](7) NOT NULL
)

我希望sql Server在创建新条目时将CreatedOnUtc的值设置为UTC-Now,并且不允许外部命令设置此值。

这可能吗?

解决方法

这是两个问题。对于第一个:

CREATE TABLE [dbo].[Values] (
    [Id] [uniqueidentifier] NOT NULL,[Value] [nvarchar](150) NOT NULL,[CreatedOnUtc] [datetime2](7) NOT NULL DEFAULT SYSUTCDATETIME() 
);

防止更改列的规范方法是使用触发器,以防止更新或插入值。

请注意,Values对于表来说确实是一个坏名字,因为它是SQL关键字和SQL Server保留字。选择不需要转义的标识符。

还有其他方法。例如,您可以关闭对表的DML访问。然后创建一个没有CreatedOnUtc的视图,只允许通过该视图进行插入和更新。