如何将db模式更改为dbo


115

我将一堆表从旧的sql server(2000)导入到2008数据库中。所有导入的表都以我的用户名作为前缀,例如:jonathan.MovieData。在表中,propertiesjonathan作为数据库模式列出。现在,当我编写存储过程时,我必须jonathan.在所有表名的前面添加一个令人困惑的表名。

如何将所有表更改为dbo而不是jonathan?

当前结果: jonathan.MovieData

所需结果: dbo.MovieData

Answers:


179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

请参阅ALTER SCHEMA

通用语法:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 

12
为节省Google员工的时间,请执行以下操作:ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Co7e 2015年

1
如果用户使用反斜杠,请运行以下命令:ALTER SCHEMA dbo TRANSFER“ DOMAIN \ user” .tableName
PatricF

@PatricF带引号的标识符规则与其他名称一样适用于架构名称[DOMAIN\user].[tableName]。通常,在SQL Server社区中,使用Transact-SQL引用的标识符([]),"除非有特殊要求,否则应避免使用。
Remus Rusanu'3

至于他要了我所有的表,检查这个这个做在单个语句,希望可以帮助一些之一。
shaijut

2
@leigero使用[and ],就像您想精确了解SQL对象名称的其他情况一样。[domain\user123].TableName
Remus Rusanu

40

您可以运行以下命令,这将为您的所有表生成一组ALTER sCHEMA语句:

SELECT 'ALTER SCHEMA dbo TRANSFER ' + TABLE_SCHEMA + '.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'jonathan'

然后,您必须在查询分析器中复制并运行语句。

我认为这是一个较旧的脚本,它将通过为您更改对象所有者来为您完成此操作。不过,在2008年还没有尝试过。

DECLARE @old sysname, @new sysname, @sql varchar(1000)

SELECT
  @old = 'jonathan'
  , @new = 'dbo'
  , @sql = '
  IF EXISTS (SELECT NULL FROM INFORMATION_SCHEMA.TABLES
  WHERE
      QUOTENAME(TABLE_SCHEMA)+''.''+QUOTENAME(TABLE_NAME) = ''?''
      AND TABLE_SCHEMA = ''' + @old + '''
  )
  EXECUTE sp_changeobjectowner ''?'', ''' + @new + ''''

EXECUTE sp_MSforeachtable @sql

从此站点得到它。

如果需要,它还讨论了对存储的proc进行相同的操作。


我尝试了第二步都无济于事,但是感谢您的链接,我将对其进行调查。
乔纳森·霍尔

您是否无法使用上面的INFORMATION_SCHEMA选择自动生成所有ALTER SCHEMA语句?
patmortech

请注意以下来自INFORMATION_SCHEMA.TABLES文档的引文:重要不要使用INFORMATION_SCHEMA视图确定对象的架构。查找对象架构的唯一可靠方法是查询sys.objects目录视图。” 因此,该示例应重写为使用sys.tables(sys.objects的子集)。
Heinzi


15

将表从dbo模式移至MySchema:

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


将表从MySchema移动到dbo模式:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable

9

我刚刚将其发布到一个类似的问题:在sql server 2005中,如何更改表的“模式”而不丢失任何数据?


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

我添加了一个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数据传输以更改目标架构...我最终只是针对还原后的数据库运行了该数据库转储到新服务器上,以我想要的方式进行操作。


工作请客。谢谢。
bgx



2

我有一个类似的问题,但我的架构中有一个反斜杠。在这种情况下,请在架构周围包括方括号。

ALTER SCHEMA dbo TRANSFER [DOMAIN\jonathan].MovieData;

2

打开SQL Server作为SA帐户,然后单击以下查询之后的新查询

然后单击执行,它将所有拥有的架构回滚到SA帐户

alter authorization on schema::[db_datareader] to [dbo]
alter authorization on schema::[db_datareader] to [db_datareader]
alter authorization on schema::[db_datawriter] to [dbo]
alter authorization on schema::[db_datawriter] to [db_datawriter]
alter authorization on schema::[db_securityadmin] to [dbo]
alter authorization on schema::[db_securityadmin] to [db_securityadmin]
alter authorization on schema::[db_accessadmin] to [dbo]
alter authorization on schema::[db_accessadmin] to [db_accessadmin]
alter authorization on schema::[db_backupoperator] to [dbo]
alter authorization on schema::[db_backupoperator] to [db_backupoperator]
alter authorization on schema::[db_ddladmin] to [dbo]
alter authorization on schema::[db_ddladmin] to [db_ddladmin]
alter authorization on schema::[db_owner] to [dbo]
alter authorization on schema::[db_owner] to [db_owner]

1

ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/0a760138-460e-410a-a3c1-d60af03bf2ed.htm

ALTER SCHEMA schema_name传输securable_name

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.