当前位置: 首页 > 面试题库 >

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

闾丘诚
2023-03-14
问题内容

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

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


问题答案:

对的,这是可能的。

要更改数据库对象的架构,您需要运行以下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;

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



 类似资料:
  • 问题内容: 我正在使用MS SQL Server,并且想通过执行“将viewname更改为([somesql])”之类的东西来更改存储过程中的视图。 google抛出的一些页面断言,它不直接受支持(也没有相关的alter-table语句),但是也有一些示例,说明了如何使用如下构造方法来解决此问题: 以文字字符串形式编写代码有一点气味,即使对于SQL来说也是如此。 我的问题: 为什么不支持此功能?从

  • 问题内容: 我正在寻找一种方法来列出在Informix上运行的数据库中的所有存储过程。 数据库中是否有表格列出存储过程以及有关存储过程的详细信息? 问题答案: 就在这里。叫做。尝试此操作以查看所有内容:

  • 本文向大家介绍MSSQL事务的存储过程,包括了MSSQL事务的存储过程的使用技巧和注意事项,需要的朋友参考一下 在酒店管理系统开发中,我们会创建房间表和房间类型表(房型表)这两个表,如下图所示: 房型表:RoomType             房间表:Room   首先这两个表的关系:Room是从表,RoomType是主表,两表有主外键关系,RoomType.rTypeId=Room.rType

  • 问题内容: 我想在sql查询中更改表的动态名称。例如,我有下一个存储过程: 我需要在运行时更改 tableName ,我可以这样做吗?谢谢。 问题答案: 您必须使用动态SQL来准备和执行SQL字符串,以实现您所描述的内容。 在准备之前,必须将动态表名称(或列名称或SQL关键字等)内插到SQL字符串中。您不能将查询参数用于这些动态元素。 当您将表名称插入到SQL查询中时,请小心避免SQL注入漏洞。例

  • 问题内容: 我有许多使用CTE,临时表,表变量和子查询的存储过程,我需要获取该存储过程中使用的所有列(包括数据库,架构和表/视图)的列表。我不需要获取临时表,表变量或CTE中的列。我只需要在服务器上的数据库的表或视图中定义的引用列。 我试过了,但是在第一个选择查询后或在CTE中选择后,它们不返回列。 问题答案: 当执行存储过程时,它将被解析并编译成查询计划,将对其进行缓存,您可以通过sys.dm_

  • 问题内容: 我试图使用下面的代码获取MSSQL nodejs包以从Microsoft SQL Server返回存储过程的结果。但是我得到的错误是… 我不确定我是否正确地完成了输入,因为我找不到在线上有多个输入的示例。 有任何想法吗? 我使用软件包“ Seriate”成功完成了请求,但希望使用mssql。适用于“ Seriate”的代码如下。 问题答案: 我认为线的 这有req.input那似乎是错