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

Dev*_*ris 73 database sql-server

我有一个进入"db_owner"模式的表,我需要它在"dbo"模式中.

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

Ste*_*ton 83

ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]
Run Code Online (Sandbox Code Playgroud)

  • 你刷新了表格清单吗?我发现Management Studio倾向于不更新数据库列表以反映通过tsql执行的更改(而不是选择表并使用内置工具),除非您强制执行.或者你断开/重新连接. (3认同)
  • 与使用GUI相反,可重用脚本的+1. (2认同)

Jas*_*yon 81

在SQL Server Management Studio中:

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

  • 谢谢,好笑,如果你只是右击 - >属性架构是不可更改的,所以我认为它只是那些命令ninja任务之一.很高兴知道它不像它感觉那么痛苦. (6认同)
  • 修改可能被称为设计,具体取决于所使用的SQL Server Management Studio的版本. (2认同)
  • 如果只看到"列属性"窗口.转到查看并选择"属性窗口".编辑后,不要忘记保存更改. (2认同)

小智 12

TABLE_SCHEMA通过此选择显示全部:

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
Run Code Online (Sandbox Code Playgroud)

您可以使用此查询将所有表的所有架构更改为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
Run Code Online (Sandbox Code Playgroud)


Jer*_*emy 7

简单的答案

sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'
Run Code Online (Sandbox Code Playgroud)

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

  • 这个proc已被弃用 (2认同)

Lan*_*ico 5

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

我添加了一个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
Run Code Online (Sandbox Code Playgroud)

我也不得不恢复dbdump,并发现架构不是dbo - 我花了好几个小时试图让Sql Server管理工作室或visual studio数据传输来改变目标架构......我最后只是针对恢复运行这个在新服务器上转储以获得我想要的方式.