关于数据库:在sql server 2005中,如何更改表的“模式”而不丢失任何数据?

关于数据库:在sql server 2005中,如何更改表的“模式”而不丢失任何数据?

In sql server 2005, how do I change the “schema” of a table without losing any data?

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

是否有运行脚本或命令以进行切换?


1
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]

在SQL Server Management Studio中:

  • 右键单击该表,然后选择"修改"(现在称为"设计")
  • 在属性面板上,选择正确的拥有架构。

  • 通过此选择显示所有TABLE_SCHEMA

    1
    2
    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES

    您可以使用此查询将所有表的所有架构更改为dbo表架构:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    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

    简单的答案

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

    您无需停止与数据库的所有连接,这可以随时进行。


    sAeid的出色回答略有改进...

    我添加了一个exec以使该代码自动执行,并且在顶部添加了一个并集,以便可以更改两个表和存储过程的架构:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    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数据传输来更改目标架构...我最终只是针对还原后的数据库运行了它在新服务器上转储以按我想要的方式进行操作。


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


    我将其用于一堆表需要处于不同架构(在这种情况下为dbo架构)的情况下。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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 )
    ;

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

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

    在哪是表名。


    推荐阅读

      linux操作数据库命令?

      linux操作数据库命令?,地址,服务,系统,密码,数据库,工具,名字,首页,命令,参

      linux下载数据命令?

      linux下载数据命令?,软件,工具,数据,系统,代理,官网,网络,名称,网址,盘中,在l

      做数据linux常用命令?

      做数据linux常用命令?,工作,系统,基础,网络,数据,标准,管理,工具,地址,命令,l

      linux数据库升级命令?

      linux数据库升级命令?,系统,信息,时间,最新,网络,名字,地址,管理,简介,传播,l

      linux命令行模式登录?

      linux命令行模式登录?,系统,密码,信息,状态,情况,终端,环境,管理,电脑,位置,l

      linux退出命令模式?

      linux退出命令模式?,状态,档案,命令,环境,密码,终端,文件,模式,编辑,端口,lin

      linux命令模式加行?

      linux命令模式加行?,工作,地址,系统,命令,工具,正规,信息,时间,第一,模式,Lin

      linux命令行模式使用?

      linux命令行模式使用?,工作,地址,目录,信息,名称,系统,管理,命令,文件,标准,l

      数据库导出linux命令?

      数据库导出linux命令?,密码,数据,数据库,情况,地址,系统,工具,网上,名字,命

      linux命令与数据流?

      linux命令与数据流?,工作,地址,系统,信息,命令,目录,标准,网络,管理,常用命

      linux切换成命令模式?

      linux切换成命令模式?,密码,系统,工具,模式,命令,首页,状态,图形界面,终端,

      linux恢复数据库命令?

      linux恢复数据库命令?,工具,系统,软件,数据,盘中,密码,命令,备份,数据库,文

      linux储存命令数据?

      linux储存命令数据?,系统,工作,地址,信息,标准,命令,工具,实时,数据,分析,lin

      linux命令行模式清页?

      linux命令行模式清页?,工作,系统,命令,信息,地址,目录,内容,文件,操作,功能,l

      linux储存命令数据?

      linux储存命令数据?,系统,工作,地址,信息,标准,命令,工具,实时,数据,分析,lin

      linux进入命令行模式?

      linux进入命令行模式?,系统,地址,情况,工作,命令,终端,首页,信息,目录,界面,l

      linux命令大全数据库?

      linux命令大全数据库?,服务,系统,平台,状态,软件,通用,环境,数据,神州,地址,

      linux上数据库的命令?

      linux上数据库的命令?,服务,系统,信息,地址,命令,密码,工具,管理,数据,单位,

      linux命令dm数据库?

      linux命令dm数据库?,地址,软件,时间,设备,名字,服务,位置,名称,公司,命令,lin

      linux底线模式命令?

      linux底线模式命令?,系统,档案,密码,状态,工作,命令,模式,文件,明文,界面,lin