代码之家  ›  专栏  ›  技术社区  ›  DevelopingChris

在SQLServer2005中,如何在不丢失任何数据的情况下更改表的“模式”?

  •  72
  • DevelopingChris  · 技术社区  · 17 年前

    是否需要运行脚本或命令来切换?

    8 回复  |  直到 16 年前
        1
  •  86
  •   Indeed is Trash    14 年前

    在SQL Server Management Studio中:

    1. 右键单击表格并选择修改(现在称为“设计”)
    2. 在“属性”面板上,选择正确的拥有架构。
        2
  •  84
  •   SqlZim    9 年前
    ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]
    
        3
  •  12
  •   sth    16 年前

    TABLE_SCHEMA 通过此选项选择:

    SELECT TABLE_SCHEMA, TABLE_NAME 
    FROM INFORMATION_SCHEMA.TABLES 
    

    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
    
        4
  •  7
  •   Jeremy    17 年前

    简单回答

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

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

        5
  •  5
  •   Lanceomagnifico    14 年前

    A. 对sAeid优秀答案的改进。。。

    我添加了一个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
    

        6
  •  4
  •   Anthony K    17 年前

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

        7
  •  2
  •   Oliver    15 年前

    我将其用于一组表需要位于不同模式(在本例中为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
  •  -3
  •   sth    16 年前

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

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

    哪里是表名。