标签: temporal-tables

SQL Server 2016 SP1 + 长期版本保留策略(快照、时态表、其他?)

我们有一个从上游数据仓库提供的数据集市,我们为外部各方生成报告。我有一个业务需求,要在每个月末保留数据库的状态,以确保结果的可重复性,以防我们被要求在同一时间段内进行更多分析。数据库 <100GB,大约 40-50 个表,没什么太疯狂的。

我知道 SQL 2016 SP1 中有一些有趣的新选项需要考虑。我在这里的目标不是快速/轻松访问前几个月,而是更多关于数据的完整性/不变性,但任何涵盖后者同时在前者中领先的解决方案都会赢得这一轮。

哪种方法在这里最有意义?

  1. 传统备份:存档到外部存储,根据需要恢复。但这显然是 DBA 方面最麻烦的,也是自助服务最少的选项。注意:由于我需要保留所有副本,之后这将是很多存储空间。
  2. 数据库快照:创建快照并无限期保留。但是我不知道有什么解决方案可以让我保护快照本身,如果服务器上有任何损坏,那么我的快照就会被冲洗掉,并且无法重现它们。但自助服务方面似乎很难被击败。是否有我缺少的第 3 方解决方案?
  3. 时态表:2016 年很酷的新功能,有人真的在用吗?重构我们的方案以支持这一点看起来像是一项繁重的工作,所以这可能是不可能的。
  4. 基于@Max Vernon 的建议......每月恢复到只读数据库,也许使用 Stretch Database:这听起来不错,因为这将是很多冷数据......但实际上有人使用 Stretch Database 吗?这是微软会在几年内悄悄弃用的东西吗?
  5. 我在这里完全失踪的其他东西?

更新:截至 2019 年年中,Stretch Database 的启动成本相当高,仅用于 Azure 中的计算(额外存储)的起价约为 1800 美元/月,所以我想说这使得它无法实现更大的用例。

sql-server best-practices snapshot temporal-tables sql-server-2016

3
推荐指数
1
解决办法
89
查看次数

有没有人有一个存储过程来截断时态表?

有没有人知道或知道将执行通用临时表操作以便历史记录和主表都被截断的存储过程?

您必须更改它以设置 system_versioning = off,然后删除历史表,然后截断主表,然后在主表上重新启用版本控制。我打算构建一个通用存储过程来为传递给它的任何数据库/模式/表名称执行此操作,但如果有人已经拥有它,肯定会很好。如果可以避免的话,我从不喜欢重新发明轮子。

sql-server stored-procedures temporal-tables

2
推荐指数
1
解决办法
1599
查看次数

带有历史表的 SQL Server 复制

是否可以复制 SQL Server 数据库并让副本拥有临时/历史表?

详细信息:
我有一个生产系统,运行 SQL Server 2014。我想要一个副本数据库,并且我还想跟踪历史更改。

将生产数据库复制到 SQL Server 2016 实例并跟踪时态/历史表的更改将是理想的选择。

这可能吗?
这在 Azure 上可能吗?

编辑:第 2 部分

在大卫·布朗的出色回答和进一步阅读之后,我有了更多的方向和更多的问题。我将使用 Azure SQL 数据库/逻辑服务器。我将使用事务复制,因为 1. Azure SQL 数据库支持它,2. 我们可以在发布者 (Sql Server 2014) 上禁用时态表,并在订阅者 (Azure SQL 数据库/逻辑服务器) 上启用时态表。大卫·布朗的出色回答。

第 2 部分问题:当“发布者”数据库成为发布者时,它会承受多少额外负载?

设置此功能时如何避免停机和锁定发布者?

我有多个“发布者”数据库。我可以在一个 Azure SQL 数据库/逻辑服务器实例上拥有多个订阅者数据库吗?

replication sql-server sql-server-2014 temporal-tables sql-server-2016

2
推荐指数
1
解决办法
963
查看次数

视图中的时态表语法

考虑以下情况。我有一个系统版本的表“测试”。我还有一个表,其中包含我上次检查该表中已修改行的时间。

CREATE TABLE [Delta]
(
    Tablename NVARCHAR(50) NOT NULL,
    Proccess UNIQUEIDENTIFIER NOT NULL,
    LastDelta DATETIME2 NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

我现在想创建一个执行此查询的视图

Fake syntax
SELECT * 
FROM [test]
FOR SYSTEM_TIME AS OF (select LastDelta from Delta where TableName = 'Test')
Run Code Online (Sandbox Code Playgroud)

提供日期时间的唯一选项是固定值或参数吗?参数对视图没有用处,固定值也无济于事。

我可以用我自己的查询模拟“for system_time as of”的效果,但我想知道是否有一种我错过的方法,如“假语法”或类似的所示。

sql-server temporal-tables

2
推荐指数
1
解决办法
75
查看次数

如何抑制或禁用单个语句或事务的时态表历史插入?

我有一张表存储客户信息(您的沼泽标准 CRM 资料):

CREATE TABLE dbo.Customers (
    TenantId    int            NOT NULL,
    CustomerId  int            NOT NULL,
    
    FirstName   nvarchar(50)   NOT NULL DEFAULT '',
    LastName    nvarchar(50)   NOT NULL DEFAULT '',
    CompanyName nvarchar(50)   NOT NULL DEFAULT '',

    Notes       nvarchar(4000) NOT NULL DEFAULT ''
)
Run Code Online (Sandbox Code Playgroud)

此表最近已转换为 SQL Server 时态表:

ALTER TABLE dbo.Customers
    ADD COLUMN
        SysStart datetime2(7) GENERATED ALWAYS AS ROW START NOT NULL,
        SysEnd   datetime2(7) GENERATED ALWAYS AS ROW END   NOT NULL;

GO

ALTER TABLE dbo.Customers WITH (
    PERIOD FOR SYSTEM_TIME ( SysStart, SysEnd ), …
Run Code Online (Sandbox Code Playgroud)

sql-server azure-sql-database temporal-tables

0
推荐指数
1
解决办法
48
查看次数