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

时间:2013-07-10 12:56:44

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

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

我们开始收到有关未找到数据库对象的错误。后来我们发现它是由于修改后的模式名称而发生的。由于Kentico数据库中有数百个数据库对象(表,视图和存储过程),因此无法一个接一个地手动更改所有这些对象。这是否有实用的方法?

4 个答案:

答案 0 :(得分:84)

是的,有可能。

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

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

答案 1 :(得分:3)

这是我运行的SQL,用于将数据库中的所有表(分布在多个模式中)移动到" dbo"架构:

DECLARE 
    @currentSchemaName nvarchar(200),
    @tableName nvarchar(200)

DECLARE tableCursor CURSOR FAST_FORWARD FOR 
SELECT TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables
ORDER BY 1, 2

DECLARE @SQL nvarchar(400)

OPEN tableCursor 
FETCH NEXT FROM tableCursor INTO @currentSchemaName, @tableName

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQL = 'ALTER SCHEMA dbo TRANSFER ' + @currentSchemaName + '.' + @tableName
    PRINT @SQL

    EXEC (@SQL)

    FETCH NEXT FROM tableCursor INTO @currentSchemaName, @tableName
END

CLOSE tableCursor 
DEALLOCATE tableCursor 

呼!

答案 2 :(得分:2)

感谢您的提示..这是我的更新,我添加了一个crlf输出以及在SchemaName和ObjectName周围放置括号,因为有些对象有一个' - '在名称和括号中解决了命名错误。

pairRDD.combineByKey(createCombiner, mergeValue, mergeCombiners)

答案 3 :(得分:1)

您只需复制/粘贴所有对象即可使用以下脚本

注意 :您需要在脚本中更改架构名称!

DECLARE @OldSchema VARCHAR(200)
DECLARE @NewSchema VARCHAR(200)
DECLARE @SQL nvarchar(4000)
SET @OldSchema = 'dbo'
SET @NewSchema = 'Inf'

DECLARE tableCursor CURSOR FAST_FORWARD FOR 
    SELECT 'ALTER SCHEMA  ['+ @NewSchema +'] TRANSFER [' + SysSchemas.Name + '].[' + DbObjects.Name + '];' AS Cmd
    FROM sys.Objects DbObjects
    INNER JOIN sys.Schemas SysSchemas ON DbObjects.schema_id = SysSchemas.schema_id
    WHERE SysSchemas.Name = @OldSchema
    AND (DbObjects.Type IN ('U', 'P', 'V'))
OPEN tableCursor 
FETCH NEXT FROM tableCursor INTO  @SQL
WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @SQL
    EXEC (@SQL)
    FETCH NEXT FROM tableCursor INTO  @SQL
END
CLOSE tableCursor 
DEALLOCATE tableCursor 
PRINT '*** Finished ***'