with tutorial framework español djangoproject desde con cero applications sql-server database

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:

  1. Haga clic derecho en la tabla y seleccione modificar (ahora se llama "Diseño")
  2. 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]