最近,我一直在尝试重组一个没有设计文件组(只是默认PRIMARY
)的旧数据库,并且除其他外,将一堆表移动到Data
位于 SAN 上的新文件组。我知道如何迁移数据:
ALTER TABLE MyTable
DROP CONSTRAINT PK_MyTable WITH (MOVE TO [MyDB_Data])
ALTER TABLE MyTable
ADD CONSTRAINT PK_MyTable
PRIMARY KEY CLUSTERED (MyID)
ON [MyDB_Data]
但该死的,如果这不是我曾经做过的最乏味的工作。而且很容易出错。有一次,在我意识到我不小心在 PK 中包含了一个值列之前,我移动了一个 30 GB 表的一半(我假设,因为没有进度指示器)。所以我不得不重新开始。
当表有很多依赖时,情况会更糟。然后我不能只删除主键;我必须删除并重新创建每个引用它的外键。这导致了数百行样板代码;乘以 100 个表,它就变得非常愚蠢。我的手腕受伤了。
有没有人想出一个捷径呢?是否有任何工具(以一次性使用的概念定价)可以做到这一点?也许这里的某个人之前必须经历过这个过程并编写了他们自己不介意分享的工具/脚本?
SSMS 显然不会这样做 - 它只能为非聚集索引生成迁移脚本(并且它们必须是索引,而不是UNIQUE
约束 - 至少在几个表上,无论好坏,聚集索引实际上并不是主键,这是一个不同的UNIQUE
约束)。
并不是语法太复杂以至于我无法为它编写代码生成器。至少对于基本的 drop-and-recreate-the-primary-key 部分。但是加上计算所有依赖项并为所有外键生成删除/重新创建脚本的开销,这开始感觉它刚刚超过那个阈值,在这个阈值中,自动化和全面测试的工作量比只做每个表的工作量要多与上面的示例一样手动。
所以,问题是:这个过程可以以任何相当直接的方式自动化吗? 我上面写的还有其他选择吗?
谢谢!