sql - 如何更改 MSSQL 中所有表、 View 和存储过程的架构

标签 sql sql-server-2008 database-schema database-migration kentico

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

我们开始收到有关未找到数据库对象的错误。后来我们发现它是由于修改了模式名称而发生的。由于 Kentico 数据库中有数百个数据库对象(表、 View 和存储过程),因此手动逐一更改所有这些对象是不可行的。有没有可行的方法来做到这一点?

最佳答案

对的,这是可能的。

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

ALTER SCHEMA NewSchemaName TRANSFER OldSchemaName.ObjectName

其中 ObjectName 可以是表、 View 或存储过程的名称。问题似乎是获取具有给定 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”表示 View ,“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;

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

关于sql - 如何更改 MSSQL 中所有表、 View 和存储过程的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17571233/

相关文章:

sql - 在 SQLClient 中访问 Hive 表,但不能从 Putty 中访问

mysql - 使用 SELECT * FROM 表

mysql - 如何在不使用日期字段的情况下选择两个日期之间的所有记录?

c# - 在 db - C# 中存储静态数据好吗?

sql - 无法在sql server中删除和创建数据库

mysql - 表之间具有一对一关系的理由

java - MS SQL 异常 : Incorrect syntax near '@P0'

sql - 将 DateTime 分组为 5、15、30 和 60 分钟间隔

mysql - Zend Framework 2 中的数据库架构

mysql - 合并同一个表中的多行(一周中的几天)