如何将 db 架构更改为 dbo

Posted

技术标签:

【中文标题】如何将 db 架构更改为 dbo【英文标题】:How do I change db schema to dbo 【发布时间】:2010-11-11 21:47:43 【问题描述】:

我将一堆表从旧的 sql server (2000) 导入到我的 2008 数据库中。所有导入的表都以我的用户名作为前缀,例如:jonathan.MovieData。在表properties 中,它将jonathan 列为数据库模式。当我编写存储过程时,我现在必须在所有表名前包含jonathan.,这很容易混淆。

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

当前结果:jonathan.MovieData

想要的结果:dbo.MovieData

【问题讨论】:

【参考方案1】:

如果您想一次更改所有表、视图和过程,请使用此代码。

BEGIN
DECLARE @name NVARCHAR(MAX)
        , @sql NVARCHAR(MAX)
        , @oldSchema NVARCHAR(MAX) = 'MyOldSchema'
        , @newSchema NVARCHAR(MAX) = 'dbo'
        
DECLARE objCursor CURSOR FOR
        SELECT  o.name
        FROM    sys.objects o
        WHERE   type IN ('P', 'U', 'V')

OPEN    objCursor
        FETCH NEXT FROM objCursor INTO @name
        WHILE   @@FETCH_STATUS = 0
        BEGIN
            SET @sql = 'ALTER SCHEMA '+ @newSchema +' TRANSFER '+ @oldSchema + '.' +  @name         
            BEGIN TRY
                exec(@sql)
                PRINT 'Success: ' + @sql
            END TRY
            BEGIN CATCH
                PRINT 'Error executing: ' + @sql
            END CATCH
            FETCH NEXT FROM objCursor INTO @name
        END
CLOSE   objCursor
DEALLOCATE  objCursor

结束

它会执行这样的代码

ALTER SCHEMA dbo TRANSFER MyOldSchema.xx_GetUserInformation

【讨论】:

【参考方案2】:

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

然后点击执行,它会将所有拥有的架构回滚到 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]

【讨论】:

【参考方案3】:
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

见ALTER SCHEMA。

通用语法:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 

【讨论】:

为 Google 员工节省时间:ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 如果用户有反斜杠,请运行以下命令:ALTER SCHEMA dbo TRANSFER "DOMAIN\user".tableName @PatricF quoted identifiers 规则适用于模式名称,就像适用于任何其他名称一样:[DOMAIN\user].[tableName]。通常在 SQL Server 社区中使用 Transact-SQL 引用标识符([]),除非有特定要求,否则避免使用 " 当他要求 我所有的表格 时,请检查 this 和 this 在单个语句中执行此操作,希望对某人有所帮助。 @leigero 使用[],就像您想要准确了解 SQL 对象名称的任何其他情况一样。 [domain\user123].TableName.【参考方案4】:

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

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

【讨论】:

【参考方案5】:

您可以按照本文所述批量更改多个数据库对象的架构:

How to change schema of all tables, views and stored procedures in MSSQL

【讨论】:

【参考方案6】:

将表从 dbo 架构移动到 MySchema:

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable

将表从 MySchema 移动到 dbo 架构:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable

【讨论】:

【参考方案7】:

我刚刚发布了一个类似的问题:In sql server 2005, how do I change the "schema" of a table without losing any data?


对 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 Server 管理工作室或 Visual Studio 数据传输来改变目标架构......我最终只是运行了这个反对新服务器上恢复的转储,以按照我想要的方式获取内容。

【讨论】:

【参考方案8】:

为个别事情做这件事的方法:

改变架构 dbo 传输 jonathan.MovieData

【讨论】:

【参考方案9】:

您可以运行以下命令,这将为您的所有表格生成一组 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

从this site得到它。

如果需要,它还谈到了对存储过程执行相同操作。

【讨论】:

我尝试了第二个位无济于事,但感谢您的链接,我会调查一下。 您不能使用上面的 INFORMATION_SCHEMA 选择自动生成所有 ALTER SCHEMA 语句吗? 请注意documentation of INFORMATION_SCHEMA.TABLES 中的以下引用:"重要 不要使用 INFORMATION_SCHEMA 视图来确定对象的架构。找到对象的唯一可靠方法对象的模式是查询 sys.objects 目录视图。” 因此,应该重写示例以使用 sys.tables(sys.objects 的子集)。 我建议手动将表更改为 dbo 而不是一些循环,以确保。这是一个非常关键的操作。 sqlfreelancer.com/blog/?p=381【参考方案10】:
USE MyDB;
GO
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
GO

参考:ALTER SCHEMA

【讨论】:

【参考方案11】:

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

ALTER SCHEMA schema_name TRANSFER securable_name

【讨论】:

以上是关于如何将 db 架构更改为 dbo的主要内容,如果未能解决你的问题,请参考以下文章

将数据框架构从 int 更改为 double 的问题

修改现有表的架构时出现“找不到对象”错误

Google BigQuery:错误:架构更新无效。字段已将模式从 REQUIRED 更改为 NULLABLE

SQL Server 角色、架构、用户

LINQPad,使用多个datacontexts

将 armv6/armv7 架构更改为 armv6 对我的 iPad 应用程序有何影响?会有性能/稳定性损失吗?