¿Cómo cambio el esquema db a dbo?

115

Importé un montón de tablas de un servidor SQL antiguo (2000) a mi base de datos de 2008. Todas las tablas importadas tienen el prefijo mi nombre de usuario, por ejemplo: jonathan.MovieData. En la tabla propertiesaparece jonathancomo esquema db. Cuando escribo procedimientos almacenados, ahora tengo que incluirlos jonathan.delante de todos los nombres de las tablas, lo cual es confuso.

¿Cómo cambio todas mis tablas para que sean dbo en lugar de jonathan?

Resultado actual: jonathan.MovieData

Resultado deseado: dbo.MovieData

Jonathan Hall
fuente

Respuestas:

179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

Consulte ALTER SCHEMA .

Sintaxis generalizada:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 
Remus Rusanu
fuente
12
Para ahorrar tiempo a los empleados de Google: ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Co7e
1
Si el usuario tiene una barra invertida, ejecute lo siguiente: ALTER SCHEMA dbo TRANSFER "DOMINIO \ usuario" .tableName
PatricF
@PatricF El citado identificadores de reglas se aplican a nombres de esquema al igual que a cualquier otro nombre: [DOMAIN\user].[tableName]. En general, en la comunidad de SQL Server se utilizan ( [y ]) los identificadores entre comillas de Transact-SQL , evítelos a "menos que exista un requisito específico para ello.
Remus Rusanu
Como pidió todas mis tablas , marque esto y esto para hacerlo en una sola declaración, la esperanza ayuda a alguien.
shaijut
2
@leigero use [y ], como cualquier otro caso, cuando desee ser preciso sobre el nombre de un objeto SQL. [domain\user123].TableName.
Remus Rusanu
40

Puede ejecutar lo siguiente, que generará un conjunto de declaraciones ALTER sCHEMA para todos sus talbes:

SELECT 'ALTER SCHEMA dbo TRANSFER ' + TABLE_SCHEMA + '.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'jonathan'

Luego debe copiar y ejecutar las declaraciones en el analizador de consultas.

Aquí hay una secuencia de comandos anterior que también lo hará por usted, creo que al cambiar el propietario del objeto. Sin embargo, no lo he probado en 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

Lo obtuve de este sitio .

También habla de hacer lo mismo con los procesos almacenados si es necesario.

patmortech
fuente
Probé el segundo bit sin éxito, pero gracias por el enlace, lo investigaré.
Jonathan Hall
¿No pudo utilizar la selección de INFORMATION_SCHEMA anterior para generar todas sus declaraciones ALTER SCHEMA automáticamente?
patmortech
Tenga en cuenta la siguiente cita de la documentación de INFORMATION_SCHEMA.TABLES : " Importante No utilice las vistas INFORMATION_SCHEMA para determinar el esquema de un objeto. La única forma confiable de encontrar el esquema de un objeto es consultar la vista de catálogo sys.objects". Por lo tanto, el ejemplo debe reescribirse para usar sys.tables(un subconjunto de sys.objects) en su lugar.
Heinzi
21
USE MyDB;
GO
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
GO

Ref: ALTER SCHEMA

Trigo Mitch
fuente
15

Mueva la tabla del esquema dbo a MySchema:

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


Mueva la tabla de MySchema al esquema dbo:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable
Neru-J
fuente
9

Acabo de publicar esto en una pregunta similar: En SQL Server 2005, ¿cómo cambio el "esquema" de una tabla sin perder ningún dato?


Una ligera mejora a la excelente respuesta de sAeid ...

Agregué un ejecutivo para que este código se autoejecutara, 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 descubrí que el esquema no era dbo; pasé horas tratando de obtener transferencias de datos de Sql Server Management Studio o Visual Studio para alterar el esquema de destino ... Terminé ejecutando esto contra el restaurado volcar en el nuevo servidor para hacer las cosas como yo quería.

Lanceomagnifico
fuente
Funciona de maravilla. Gracias.
bgx
2

Manera de hacerlo por una cosa individual:

alterar el esquema de transferencia dbo jonathan.MovieData

Jon Onstott
fuente
2

Tuve un problema similar, pero mi esquema tenía una barra invertida. En este caso, incluya los corchetes alrededor del esquema.

ALTER SCHEMA dbo TRANSFER [DOMAIN\jonathan].MovieData;
Puño de Hannover
fuente
2

Abra SQL Server como cuenta SA y haga clic en una nueva consulta más allá de las siguientes consultas

luego haga clic en ejecutar, se revertirá todo el esquema de propiedad a la cuenta 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]
MJ X
fuente
1

ms-help: //MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/0a760138-460e-410a-a3c1-d60af03bf2ed.htm

ALTER SCHEMA nombre_esquema TRANSFER nombre_segurable


fuente