我们有一个从上游数据仓库提供的数据集市,我们为外部各方生成报告。我有一个业务需求,要在每个月末保留数据库的状态,以确保结果的可重复性,以防我们被要求在同一时间段内进行更多分析。数据库 <100GB,大约 40-50 个表,没什么太疯狂的。
我知道 SQL 2016 SP1 中有一些有趣的新选项需要考虑。我在这里的目标不是快速/轻松访问前几个月,而是更多关于数据的完整性/不变性,但任何涵盖后者同时在前者中领先的解决方案都会赢得这一轮。
哪种方法在这里最有意义?
更新:截至 2019 年年中,Stretch Database 的启动成本相当高,仅用于 Azure 中的计算(额外存储)的起价约为 1800 美元/月,所以我想说这使得它无法实现更大的用例。
sql-server best-practices snapshot temporal-tables sql-server-2016
有没有人知道或知道将执行通用临时表操作以便历史记录和主表都被截断的存储过程?
您必须更改它以设置 system_versioning = off,然后删除历史表,然后截断主表,然后在主表上重新启用版本控制。我打算构建一个通用存储过程来为传递给它的任何数据库/模式/表名称执行此操作,但如果有人已经拥有它,肯定会很好。如果可以避免的话,我从不喜欢重新发明轮子。
是否可以复制 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
考虑以下情况。我有一个系统版本的表“测试”。我还有一个表,其中包含我上次检查该表中已修改行的时间。
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”的效果,但我想知道是否有一种我错过的方法,如“假语法”或类似的所示。
我有一张表存储客户信息(您的沼泽标准 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)