sql-server - 更新时态表历史记录

标签 sql-server

我在更新 MS SQL Server 2016 中的时态历史记录表中的行时遇到问题。

根据文档,需要执行的步骤如下:

  1. 禁用系统版本控制
  2. 修改历史表
  3. 再次启用系统版本控制

我尝试创建一个执行此操作的过程,但收到此错误:

Msg 13561, Level 16, State 1, Line 23 Cannot update rows in a temporal history table 'db.dbo.FooHistory'.

这是我的 SQL:

CREATE TABLE Foo(
    id int primary key not null
    , title nvarchar(50) not null
    , startTime datetime2 GENERATED ALWAYS AS ROW START NOT NULL
    , endTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL
    , PERIOD FOR SYSTEM_TIME (startTime, endTime) )

ALTER TABLE Foo
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.FooHistory));

GO

CREATE PROCEDURE [dbo].[UpdateFooHistory] AS
  BEGIN
    SET NOCOUNT ON

    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    BEGIN TRANSACTION;
    ALTER TABLE dbo.Foo SET (SYSTEM_VERSIONING = OFF);      

    UPDATE dbo.FooHistory
    SET title = 'Foo';

    ALTER TABLE dbo.Foo SET (SYSTEM_VERSIONING = ON (
      HISTORY_TABLE = dbo.FooHistory,
      DATA_CONSISTENCY_CHECK = ON
    ));

    COMMIT TRANSACTION

    RETURN 0
  END
GO

看起来 SQL Server 正在“编译时”而不是运行时检查表是否是临时的。这是真的?有办法解决吗?

最佳答案

将 UPDATE 语句更改为此,它将允许您创建过程:

EXEC(N'UPDATE dbo.FooHistory SET title = ''Foo''');

关于sql-server - 更新时态表历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46737825/

相关文章:

sql-server - 计算连续记录数

sql - 使用 SQL 解析 XML

java - 优化数据库搜索查询

sql-server - 无法清除 SQL Server sysmail 队列

c# - 以编程方式生成和设计 Rdlc 文件

sql-server - SQL SERVER - 有没有办法循环表中的列并在另一个 select 语句的 where 子句中使用它?

c# - 查询在 NHibernate 中出现超时错误,但在 SQL Server 中却没有

sql - 如何正确分组这个表?

php - 从sql server日期时间中获取日期

sql-server - 构建 SSIS 项目时未创建 ispac