我们目前有多个数据库,但希望将它们组合起来,而是使用模式分离我们的域上下文。
在 MS SQL Server 2008 R2 中,如何将一个架构的所有内容批量重定位到另一个架构中?
例如,我们在模式中创建的所有表、视图、过程、索引等......dbo
现在都将存在于foo
模式中。
编辑:我想根据 AaronBertrand 的精彩评论进行澄清。这不是多租户情况。我们的情况是内部工具插件是由没有将他们的表合并到工具数据库中的开发人员单独开发的。
我们目前有多个数据库,但希望将它们组合起来,而是使用模式分离我们的域上下文。
在 MS SQL Server 2008 R2 中,如何将一个架构的所有内容批量重定位到另一个架构中?
例如,我们在模式中创建的所有表、视图、过程、索引等......dbo
现在都将存在于foo
模式中。
编辑:我想根据 AaronBertrand 的精彩评论进行澄清。这不是多租户情况。我们的情况是内部工具插件是由没有将他们的表合并到工具数据库中的开发人员单独开发的。
基本概念实际上非常简单:您生成一个脚本
sys.objects
并sys.schemas
构建ALTER SCHEMA TRANSFER
语句。例如,您在dbo
架构中有三个对象,并且您希望将它们全部移动到blat
架构中:以下代码:
将产生此脚本(但可能不是按此顺序):
(您可能想要添加额外的过滤器以排除
dbo
架构中您不想移动的对象,忽略某些对象类型(例如,可能您的所有函数都是实用函数并且不需要移动),生成按对象类型排序的脚本等)但是将所有对象移动到新模式有几个问题:
可能很多你的代码仍然会引用这些对象
dbo.object
- 除了蛮力之外,没有简单的方法可以解决这个问题。您可能dbo.
很容易找到所有出现的 ,但这些也可能返回误报,例如EXEC dbo.sp_executesql
,dbo.
在评论中,对保留在dbo.
模式中的对象的真实引用等。您的依赖项可能会完全失控,但我还没有彻底测试过。我确实知道在这种情况下:
外键的迁移实际上比我预期的要顺利(需要注意的是,我正在测试的版本比你更新的版本)。但是因为里面的代码
blat.pX
还是引用dbo.bar
了,显然是在执行这个过程:将产生此错误:
以及依赖查询,例如:
将产生此错误:
并查询视图:
产生这些错误:
因此,这可能涉及大量清理工作。在您修复了所有对象引用之后,您可能需要重新编译所有模块并刷新新模式中的所有视图。您可以为此生成一个与上面的示例非常相似的脚本。