在SQL Server 2005中,如何更改表的“模式”而不丢失任何数据?

我有一个表进入“db_owner”模式,我需要在“dbo”模式。

是否有脚本或命令来运行切换?

在SQL Server Management Studio中:

  1. 右键单击表格并select修改(现在称为“devise”)
  2. 在属性面板上select正确的拥有模式。
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1] 

通过此select显示所有TABLE_SCHEMA

 SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 

您可以使用此查询将所有表的所有架构更改为dbo表架构:

 DECLARE cursore CURSOR FOR SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA <> 'dbo' DECLARE @schema sysname, @tab sysname, @sql varchar(500) OPEN cursore FETCH NEXT FROM cursore INTO @schema, @tab WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = 'ALTER SCHEMA dbo TRANSFER ' + @schema + '.' + @tab PRINT @sql FETCH NEXT FROM cursore INTO @schema, @tab END CLOSE cursore DEALLOCATE cursore 

简单的答案

 sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner' 

你不需要停止到数据库的所有连接,这可以在飞行中完成。

sAeid的优秀答案略有改善…

我添加了一个exec来让这个代码自动执行,并且我在顶部添加了一个联合,以便我可以更改表和存储过程的模式:

 DECLARE cursore CURSOR FOR select specific_schema as 'schema', specific_name AS 'name' FROM INFORMATION_SCHEMA.routines WHERE specific_schema <> 'dbo' UNION ALL SELECT TABLE_SCHEMA AS 'schema', TABLE_NAME AS 'name' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA <> 'dbo' DECLARE @schema sysname, @tab sysname, @sql varchar(500) OPEN cursore FETCH NEXT FROM cursore INTO @schema, @tab WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = 'ALTER SCHEMA dbo TRANSFER [' + @schema + '].[' + @tab +']' PRINT @sql exec (@sql) FETCH NEXT FROM cursore INTO @schema, @tab END CLOSE cursore DEALLOCATE cursore 

我也必须恢复dbdump,并发现架构不是dbo – 我花了几个小时试图让Sql Serverpipe理工作室或Visual Studio的数据传输来改变目的地模式…我结束了刚刚运行这个对恢复转储到新服务器上,以便按照我想要的方式获取内容。

当我使用SQL Management Studio时,我没有得到“修改”选项,只有“devise”或“编辑”。 如果你有Visual Studio(我已经检查了VS.NET 2003,2005和2008),你可以使用服务器资源pipe理器来改变模式。 右键单击表格并select“devise表格”(2008)或“打开表格定义”(2003,2005)。 突出显示完整的“列名”列。 然后,您可以右键单击并select“属性页”或“属性”(2008)。 从属性表中,您应该看到“Owner”(2003&2005)或“Schema”(2008),其中包含可能的模式的下拉列表。

我使用这种情况下,一堆表需要在不同的架构,在这种情况下,dbo架构。

 declare @sql varchar(8000) ; select @sql = coalesce( @sql, ';', '') + 'alter schema dbo transfer [' + s.name + '].[' + t.name + '];' from sys.tables t inner join sys.schemas s on t.[schema_id] = s.[schema_id] where s.name <> 'dbo' ; exec( @sql ) ; 

您需要首先停止到数据库的所有连接,通过运行命令更改“db_owner”表的所有权

 sp_MSforeachtable @command1="sp_changeobjectowner ""?"",'dbo'" 

哪里? 是表名。