it-swarm.cn

在sql server 2005中,如何在不丢失任何数据的情况下更改表的“模式”?

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

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

72
DevelopingChris

在SQL Server Management Studio中:

  1. 右键单击表并选择修改(现在称为“设计”)
  2. 在属性面板上,选择正确的拥有架构。
80
Jason Punyon
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]
82
Stephen Wrighton

通过此选择显示所有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
12
sAeid mOhammad hAshem

简单的答案

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

您不需要停止与数据库的所有连接,这可以在运行中完成。

7
Jeremy

A 轻微 改善sAeid的优秀答案......

我添加了一个exec来让这个代码自行执行,我在顶部添加了一个union,这样我就可以更改表和存储过程的模式:

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 Server管理工作室或visual studio数据传输来改变目标架构......我最后只是针对恢复运行这个在新服务器上转储以获得我想要的方式。

5
Lanceomagnifico

当我使用SQL Management Studio时,我没有得到“修改”选项,只有“设计”或“编辑”。如果您有Visual Studio(我已经检查过VS.NET 2003,2005和2008),您可以使用服务器资源管理器来更改架构。右键单击表并选择“设计表”(2008)或“打开表定义”(2003,2005)。突出显示完整的“列名称”列。然后,您可以右键单击并选择“属性页”或“属性”(2008)。在属性表中,您应该看到“所有者”(2003年和2005年)或“架构”(2008年),其中包含可能架构的下拉列表。

4
Anthony K

我将此用于需要在不同模式中使用一堆表的情况,在本例中为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 )
;
2
Oliver