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


74

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

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


5
Pedantry:*丢失,请校对。
GEOCHET

Answers:


84

在SQL Server Management Studio中:

  1. 右键单击该表,然后选择“修改”(现在称为“设计”)
  2. 在属性面板上,选择正确的拥有架构。

6
谢谢,有趣的是,如果您只是右键单击->属性,则架构是不可更改的,因此我认为它是仅命令忍者任务之一。很高兴知道它没有感觉到的那么痛苦。
DevelopingChris

2
根据所使用的SQL Server Management Studio的版本,修改可能称为设计。
2011年

3
如果仅看到“列属性”窗口。转到查看,然后选择“属性窗口”。编辑后,别忘了保存更改。
JonasÄppelgran17年

84
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]

这似乎并未将SQL Server Management Studio中的表从重命名OldSchema.Table1NewSchema.Table1
桑奇特

3
您是否刷新了表格列表?我发现Management Studio倾向于不更新数据库列表以反映通过tsql进行的更改(与选择表和使用内置工具相对),除非您强行执行。或者您断开/重新连接。
斯蒂芬·赖顿2013年

是的 尽管SQL Server让我相信它不是,但这绝对只是视觉上的事情。运行命令并刷新后,如果没有,如果在设计视图中右键单击该表,然后在属性窗口中将模式从oldSchema更改为newSchema,则它将刷新表名(以及警告消息)。我只是希望这样做与您的命令等效于GUI,而不是完全不同的东西。有什么办法可以检查吗?
2013年

12

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

1
这很好。请注意,PRINT @sql应将其更改为EXEC(@sql)
tharen 2014年

7

简单的答案

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

您无需停止与数据库的所有连接,这可以随时进行。


1
从技术上讲,是的。它仍然在Denali,并且可以很好地满足OP的要求。他们总是说将要删除它,但是从不删除。
杰里米

5

一个微小的改进赛义德的出色答卷......

我添加了一个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 Server Management Studio或Visual Studio数据传输来更改目标架构...我最终只是针对还原的数据库运行转储到新服务器上,以所需的方式获取内容。


好答案!+1包括例程。我的数据库也包含了它们。也有具有架构字段的VIEW和FUNCTIONs系统对象。但就我而言,它们都处于“ dbo”模式。
2015年

4

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


2

我将其用于一堆表需要处于不同架构(在这种情况下为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 )
;

-3

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

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

在哪 是表名。


不建议使用sp_changedbowner proc,并且sp_MSforeachtable和sp_MSforeachdatabase都是不可信的。我已经开始使用Bertrand版本
Oliver,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.