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

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

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

当前结果:jonathan.MovieData

想要的结果:dbo.MovieData

【问题讨论】:

    标签: sql sql-server database sql-server-2008 schema


    【解决方案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 引用标识符([]),除非有特定要求,否则避免使用 "
        • 当他要求 我所有的表格 时,请检查 thisthis 在单个语句中执行此操作,希望对某人有所帮助。
        • @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

                    【讨论】:

                      猜你喜欢
                      • 2014-11-03
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-07-12
                      • 2017-09-08
                      • 2011-07-07
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-02-04
                      相关资源
                      最近更新 更多