【发布时间】:2010-09-10 12:23:18
【问题描述】:
我有一个进入“db_owner”模式的表,我需要它在“dbo”模式中。
是否有脚本或命令可以运行来切换它?
【问题讨论】:
-
学究:*输,请校对。
标签: sql-server database
我有一个进入“db_owner”模式的表,我需要它在“dbo”模式中。
是否有脚本或命令可以运行来切换它?
【问题讨论】:
标签: sql-server database
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]
【讨论】:
OldSchema.Table1 重命名为 NewSchema.Table1。
在 SQL Server Management Studio 中:
【讨论】:
您需要首先停止与数据库的所有连接,通过运行命令更改“db_owner”表的所有权
sp_MSforeachtable @command1="sp_changeobjectowner ""?"",'dbo'"
在哪里?是表名。
【讨论】:
简单的回答
sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'
您无需停止与数据库的所有连接,这可以即时完成。
【讨论】:
当我使用 SQL Management Studio 时,我没有得到“修改”选项,只有“设计”或“编辑”。如果您有 Visual Studio(我检查过 VS.NET 2003、2005 和 2008),您可以使用服务器资源管理器来更改架构。右键单击表并选择“设计表”(2008)或“打开表定义”(2003、2005)。突出显示完整的“列名”列。然后,您可以右键单击并选择“属性页”或“属性”(2008)。在属性表中,您应该会看到“所有者”(2003 和 2005)或“架构”(2008)以及可能架构的下拉列表。
【讨论】:
通过此选择显示所有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)
我将此用于一堆表需要位于不同架构中的情况,在本例中为 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 )
;
【讨论】:
对 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 数据传输来改变目标架构......我最终只是运行这个反对新服务器上恢复的转储,以按照我想要的方式获得。
【讨论】: