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í?

el campeón
fuente
44
¿Has creado el esquema exe ?
PinnyM
1
¿Existe el esquema exe?
James Culshaw
No, no creé. ¿Qué debo hacer para crearlo?
theChampion
ejecutar create schema: msdn.microsoft.com/en-US/library/ms189462%28v=sql.90%29.aspx
a_horse_with_no_name
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
Pandiano
fuente
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
DevelopmentIsMyPassion
fuente
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.

Lauren
fuente
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 
Jason D.
fuente
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

usuario2599599
fuente
3
CREATE SCHEMA exe AUTHORIZATION [dbo]
GO

ALTER SCHEMA exe
TRANSFER dbo.Employees
GO
Dilip Kr Singh
fuente
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'
djangojazz
fuente
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.

billmack30
fuente
0

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

Para SQL Server 2000:

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

iravinandan
fuente