【问题标题】:SQL Server Prevent Update on Column (datetime2 column value set by database on insert)SQL Server 阻止更新列(插入时数据库设置的 datetime2 列值)
【发布时间】:2020-08-13 12:22:19
【问题描述】:

我有一张表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,并且不允许外部命令设置此值。

这可能吗?

【问题讨论】:

  • 您可以定义一个DEFAULT 值,是的。至于阻止人员,您要么需要确保用户只能通过存储过程进行交互(与INSERT/UDPATE 语句),要么需要DENY 他们更新列的能力。当然,sysadmin 仍然可以解决这个问题,但人们不应该使用sysadmin 帐户进行“日常”访问。

标签: sql sql-server database utc


【解决方案1】:

这是两个问题。第一个:

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 的视图,并且只允许通过该视图进行插入和更新。

【讨论】:

  • 您对范围的看法是正确的 - 我会更新标题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多