sql-server - framework - tutorial django
En sql server 2005, ¿cómo cambio el "esquema" de una tabla sin perder ningún dato? (8)
Tengo una tabla que entró en el esquema "db_owner" y la necesito en el esquema "dbo".
¿Hay un script o comando para ejecutar para cambiarlo?
Cuando uso SQL Management Studio, no obtengo la opción ''Modificar'', solo ''Diseño'' o ''Editar''. Si tiene Visual Studio (he comprobado VS.NET 2003, 2005 y 2008) puede usar Server Explorer para cambiar el esquema. Haga clic con el botón derecho en la tabla y seleccione ''Design Table'' (2008) o ''Open Table Definition'' (2003, 2005). Resalte la columna completa "Nombre de la columna". A continuación, puede hacer clic con el botón derecho y seleccionar ''Páginas de propiedades'' o Propiedades (2008). Desde la hoja de propiedades debe ver el ''Propietario'' (2003 y 2005) o ''Esquema'' (2008) con una lista desplegable para posibles esquemas.
En SQL Server Management Studio:
- Haga clic derecho en la tabla y seleccione modificar (ahora se llama "Diseño")
- En el panel de propiedades, elija el esquema de propiedad correcto.
Lo uso para situaciones en las que un grupo de tablas debe estar en un esquema diferente, en este caso el esquema 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 )
;
Muestre todos TABLE_SCHEMA
con esta selección:
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
Puede usar esta consulta para cambiar todos los esquemas de todas las tablas al esquema de tabla 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
Primero debe detener todas las conexiones a la base de datos, cambiar la propiedad de las tablas que son ''db_owner'' ejecutando el comando
sp_MSforeachtable @command1="sp_changeobjectowner ""?"",''dbo''"
dónde ? es el nombre de la tabla.
Una ligera mejora a la excelente respuesta de sAeid ...
Agregué un ejecutivo para tener este código auto-ejecutado, y agregué una unión en la parte superior para poder cambiar el esquema de ambas tablas Y procedimientos almacenados:
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
Yo también tuve que restaurar un dbdump, y encontré que el esquema no era dbo - pasé horas tratando de hacer que las transferencias de datos del estudio de gestión de Sql Server o del estudio visual alteraran el esquema de destino ... terminé simplemente ejecutando esto contra el restaurado volcar en el nuevo servidor para obtener las cosas como yo quería.
respuesta simple
sp_changeobjectowner [ @objname = ] ''object'' , [ @newowner = ] ''owner''
no necesita detener todas las conexiones a la base de datos, esto puede hacerse sobre la marcha.
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]