首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有条件地关闭时态表的历史记录

有条件地关闭时态表的历史记录
EN

Database Administration用户
提问于 2022-11-18 12:26:14
回答 1查看 40关注 0票数 2

我们正在测试的Server上有一个T迁移脚本.我们需要从时态表中删除某些数据(但不是全部),但是随机地,脚本现在正在失败。要删除历史记录,我们需要关闭历史记录,这样就不会生成新的历史记录,并且可以空出历史记录的一部分。

由于前面的失败,它会关闭一个表历史记录,并且不会在删除结束时打开它。如果历史记录已经关闭,那么新的运行将失败。

  1. 如何查看哪些表当前已关闭其历史记录。SYS.TABLES没有显示当前的状态还是这样?在那里找不到。
  2. 我能有条件地打开它们使脚本变得健壮吗?有点像条件如果存在的话..。如果对象不存在,常规拖放将失败的位置。

谢谢!

EN

回答 1

Database Administration用户

发布于 2022-11-21 01:28:10

您可以通过sys.tables查找表是否有关联的历史表。

代码语言:javascript
复制
select
  t.name,
  t.history_table_id
from sys.tables t
where t.name in (
  'Table1',
  'Table2'
);

null中使用history_table_id的表没有启用历史记录。

如果不想提供列表,可以通过sys.columns检查PERIOD列:

代码语言:javascript
复制
select
  t.name,
  t.history_table_id
from sys.tables t
where exists (select 1
    from sys.columns c
    where c.object_id = t.object_id
      and c.generated_always_type > 0
);

下面的脚本将使用默认名称自动启用历史表。

代码语言:javascript
复制
DECLARE @sql nvarchar(max);
select @sql =
  STRING_AGG('
ALTER TABLE ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + '
  SET (SYSTEM_VERSIONING = ON);
', '')
from sys.tables t
join sys.schemas s on s.schema_id = t.schema_id
where exists (select 1
    from sys.columns c
    where c.object_id = t.object_id
      and c.generated_always_type > 0
)
  and t.history_table_id is null;

PRINT @sql;  -- your friend

EXEC sp_executesql @sql;

db<>fiddle

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/319881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档