Cambiar el nombre del esquema de la tabla en SQL


175

Quiero cambiar el nombre del esquema de la tabla Employeesen la base de datos. En la tabla actual, el Employeesnombre del esquema de la base de datos es dboQuiero cambiarlo exe. Cómo puedo hacerlo ?

Ejemplo:

DE

dbo.Employees

A

exe.Employees

Intenté con esta consulta:

ALTER SCHEMA exe TRANSFER dbo.Employees

Pero esto me da un error:

No se puede alterar el esquema 'exe', porque no existe o no tiene permiso.

¿Qué me perdí?



1
¿Existe el esquema exe?
James Culshaw

No, no creé. ¿Qué debo hacer para crearlo?
theChampion


Vi este artículo pero es un poco confuso. ¿Me puede mostrar cómo crear el esquema en mi situación?
theChampion

Respuestas:


272

Crear esquema:

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'exe')) 
BEGIN
    EXEC ('CREATE SCHEMA [exe] AUTHORIZATION [dbo]')
END

ALTERAR esquema:

ALTER SCHEMA exe 
    TRANSFER dbo.Employees

3
¿Puedes explicar qué es sys.scemas y la función EXEC (...)?
theChampion

10
sys.schemases una tabla que contiene todos los esquemas para la base de datos. El Exec ('...') simplemente ejecuta una llamada dinámica de SQL, en este caso es necesario porque un comando CREATE SCHEMA debe ser la primera instrucción en un lote de consulta y ejecutarlo como SQL dinámico le proporciona esto.
Eric J. Price

Para todas las tablas , marque esto y esto para hacerlo en una sola declaración, la esperanza ayuda a alguien.
shaijut

Usar el esquema alter parece extremadamente lento. (Lo detuve después de 3 minutos para transferir una pequeña mesa con 300 filas). En su lugar, usé select * en exe.Employees from dbo.Employees
fivelements

29

Intenta abajo

declare @sql varchar(8000), @table varchar(1000), @oldschema varchar(1000), @newschema   varchar(1000)

  set @oldschema = 'dbo'
  set @newschema = 'exe'

 while exists(select * from sys.tables where schema_name(schema_id) = @oldschema)

  begin
      select @table = name from sys.tables 
      where object_id in(select min(object_id) from sys.tables where  schema_name(schema_id)  = @oldschema)

    set @sql = 'alter schema ' + @newschema + ' transfer ' + @oldschema + '.' + @table

   exec(@sql)
 end

Tuve que usar set @sql = 'alter schema [' + @newschema + '] transfer [' + @oldschema + '].' + @tablepara asegurarme de que algunas palabras / caracteres especiales no causen errores.
Stoinov

21
ALTER SCHEMA NewSchema TRANSFER [OldSchema].[TableName]

Siempre tengo que usar los corchetes cuando uso la ALTER SCHEMAconsulta en SQL, o recibo un mensaje de error.


5

A través de SSMS, creé un nuevo esquema al:

  • Al hacer clic en la carpeta Seguridad en el Explorador de objetos dentro de mi servidor,
  • Esquemas con el botón derecho
  • Seleccionado "Nuevo esquema ..."
  • Nombrado mi nuevo esquema (exe en su caso)
  • Presione OK

Encontré esta publicación para cambiar el esquema, pero también recibía el mismo error de permisos al intentar cambiar al nuevo esquema. Tengo varias bases de datos en mi SSMS, así que intenté especificar la base de datos y funcionó:

USE (yourservername)  
ALTER SCHEMA exe TRANSFER dbo.Employees 

3

Tu código es:

FROM
 dbo.Employees
TO
 exe.Employees

Intenté con esta consulta.

ALTER SCHEMA exe TRANSFER dbo.Employees

Solo escríbelo create schema exey ejecútalo


3
CREATE SCHEMA exe AUTHORIZATION [dbo]
GO

ALTER SCHEMA exe
TRANSFER dbo.Employees
GO


0

Tenga mucho cuidado al renombrar objetos en sql. Puede hacer que las dependencias fallen si no está completamente alejado de lo que está haciendo. Dicho esto, esto funciona fácilmente (demasiado) para cambiar el nombre de las cosas siempre que tenga acceso adecuado al entorno:

exec sp_rename 'Nameofobject', 'ReNameofobject'

1
Desafortunadamente, esto no funcionará en este escenario, sp_rename solo funciona para cambiar el valor [nombre] de un objeto. No puedes cambiar el esquema con él. Si lo intentaras exec sp_rename 'dbo.Employees', 'exe.Employees'obtendrías el nombre [dbo]. [Exe.Employees]
Eric J. Price

ALTERAR ESQUEMA (Nombre del esquema) TRANSFERIR (nombre del esquema) (Nombre del objeto)
djangojazz

También tenga en cuenta que cuando cambia el esquema de una tabla, las Vistas que usen esa tabla no se actualizarán. Deberá actualizar manualmente el texto (los nombres de esquema) en estas vistas. (Suspiro ...)
Mike Gledhill

0

Asegúrese de estar en el contexto de base de datos correcto en SSMS. Recibí el mismo error que tú, pero sabía que el esquema ya existía. No me di cuenta de que estaba en el contexto 'MAESTRO'. ALTER funcionó después de cambiar el contexto a mi base de datos.


0

En caso de que alguien busque una versión inferior:

Para SQL Server 2000:

sp_changeobjectowner @objname = 'dbo.Employess', @newowner = 'exe'

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.