¿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

Respuestas:


179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

Consulte ALTER SCHEMA .

Sintaxis generalizada:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 

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.


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


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

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.


Funciona de maravilla. Gracias.
bgx


2

Manera de hacerlo por una cosa individual:

alterar el esquema de transferencia dbo jonathan.MovieData


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;

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]

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.