【问题标题】:In sql server 2005, how do I change the "schema" of a table without losing any data?在 sql server 2005 中,如何更改表的“模式”而不丢失任何数据?
【发布时间】:2010-09-10 12:23:18
【问题描述】:

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

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

【问题讨论】:

  • 学究:*输,请校对。

标签: sql-server database


【解决方案1】:
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]

【讨论】:

  • 这似乎不会将 SQL Server Management Studio 中的表从 OldSchema.Table1 重命名为 NewSchema.Table1。
  • 你刷新表格列表了吗?我发现 Management Studio 往往不会更新数据库列表以反映通过 tsql 执行的更改(而不是选择表和使用内置工具),除非您强制这样做。或者您断开/重新连接。
  • 是的。它绝对只是一个视觉的东西,尽管 SQL Server 让我相信它不是。运行命令并刷新等之后,如果您在设计视图中右键单击表,然后在属性窗口中将架构从 oldSchema 更改为 newSchema,那么它会刷新表名(以及警告消息)。我只是希望这样做是与您的命令等效的 GUI,而不是完全不同的东西。有什么方法可以检查吗?
【解决方案2】:

在 SQL Server Management Studio 中:

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

【讨论】:

  • 谢谢,有趣的是,如果您只是右键单击 -> 属性,则架构是不可更改的,所以我认为它是那些只有命令的忍者任务之一。很高兴知道它没有感觉那么痛苦。
  • 修改可能被称为设计,具体取决于所使用的 SQL Server Management Studio 版本。
  • 如果您只看到“列属性”窗口。转到查看并选择“属性窗口”。编辑后,不要忘记保存更改。
【解决方案3】:

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

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

在哪里?是表名。

【讨论】:

  • sp_changedbowner proc 已弃用,sp_MSforeachtable 和 sp_MSforeachdatabase 一样不可信。我已经开始使用 Bertrand 的版本
【解决方案4】:

简单的回答

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

您无需停止与数据库的所有连接,这可以即时完成。

【讨论】:

  • 从技术上讲,是的。它仍然在德纳利,并且可以很好地满足 OP 的要求。他们总是说要删除它,但从不这样做。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 这很好用。注意PRINT @sql要改成EXEC(@sql)
    【解决方案7】:

    我将此用于一堆表需要位于不同架构中的情况,在本例中为 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 )
    ;
    

    【讨论】:

      【解决方案8】:

      对 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 数据传输来改变目标架构......我最终只是运行这个反对新服务器上恢复的转储,以按照我想要的方式获得。

      【讨论】:

      • 很好的答案! +1 包括例程。我的数据库也包含它们。还有具有架构字段的视图和功能系统对象。但就我而言,它们都在“dbo”模式中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 2011-07-12
      相关资源
      最近更新 更多