如何将 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的主要内容,如果未能解决你的问题,请参考以下文章