admin

如何在MSSQL中更改所有表,视图和存储过程的架构

sql

最近,我们的数据库服务器出现问题,经过长时间的努力,决定更换数据库服务器。因此,我们设法将数据库还原到另一台服务器上,更改了连接字符串等。一切都按计划进行,直到我们尝试从Web浏览器访问该网站。

我们开始遇到有关找不到数据库对象的错误。后来我们发现它是由于修改后的架构名称而发生的。由于Kentico数据库中有数百个数据库对象(表,视图和存储过程),因此手动逐个更改所有对象是不可行的。有可行的方法吗?


阅读 143

收藏
2021-05-10

共1个答案

admin

对的,这是可能的。

要更改数据库对象的架构,您需要运行以下SQL脚本:

ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.ObjectName

其中ObjectName可以是表,视图或存储过程的名称。问题似乎在于获取具有给定的shcema名称的所有数据库对象的列表。幸运的是,有一个名为sys.Objects的系统表可以存储所有数据库对象。以下查询将生成完成此任务所需的所有SQL脚本:

SELECT 'ALTER SCHEMA NewSchemaName TRANSFER [' + SysSchemas.Name + '].[' + DbObjects.Name + '];'
FROM sys.Objects DbObjects
INNER JOIN sys.Schemas SysSchemas ON DbObjects.schema_id = SysSchemas.schema_id
WHERE SysSchemas.Name = 'OldSchemaName'
AND (DbObjects.Type IN ('U', 'P', 'V'))

其中类型“ U”表示用户表,类型“ V”表示视图,类型“ P”表示存储过程。

运行上面的脚本将生成将对象从一种模式转移到另一种模式所需的SQL命令。像这样的东西:

ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.CONTENT_KBArticle;
ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.Proc_Analytics_Statistics_Delete;
ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.Proc_CMS_QueryProvider_Select;
ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.COM_ShoppingCartSKU;
ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.CMS_WebPart;
ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.Polls_PollAnswer;

现在,您可以运行所有这些生成的查询以完成传输操作。

2021-05-10