Alterar nome do esquema da tabela no SQL


175

Quero alterar o nome do esquema da tabela Employeesno banco de dados. Na tabela atual, o Employeesnome do esquema do banco de dados é que dboeu quero alterá-lo exe. Como eu posso fazer isso ?

Exemplo:

DE

dbo.Employees

PARA

exe.Employees

Eu tentei com esta consulta:

ALTER SCHEMA exe TRANSFER dbo.Employees

Mas isso me dá um erro:

Não é possível alterar o esquema 'exe', porque ele não existe ou você não tem permissão.

Do que eu senti falta?



1
O esquema existe?
James Culshaw

Não, eu não criei. O que devo fazer para criá-lo?
theChampion


Eu vi este artigo, mas é um pouco confuso. Você pode me mostrar como criar o esquema na minha situação?
theChampion

Respostas:


271

Criar esquema:

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

Esquema ALTER:

ALTER SCHEMA exe 
    TRANSFER dbo.Employees

3
Você pode explicar o que são as funções sys.scemas e EXEC (...)?
theChampion

10
sys.schemasé uma tabela que contém todos os esquemas do banco de dados. O Exec ('...') apenas executa uma chamada SQL dinâmica; nesse caso, é necessário porque um comando CREATE SCHEMA deve ser a primeira instrução em um lote de consulta e a execução como SQL dinâmico permite isso.
Eric J. Price

Para todas as tabelas , verifique isto e isto para fazê-lo em uma única declaração, a esperança ajuda alguém.
shaijut 03/07

O uso do esquema alter parece extremamente lento. (Parei depois de 3 minutos para transferir uma tabela pequena com 300 linhas.) Em vez disso, usei select * into exe.Employees de dbo.Employees
fivelements

29

Experimente abaixo

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

Eu tive que usar set @sql = 'alter schema [' + @newschema + '] transfer [' + @oldschema + '].' + @tablepara garantir que algumas palavras / caracteres especiais não causem erros.
Stoinov 15/11/19

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

Eu sempre tenho que usar os colchetes quando uso a ALTER SCHEMAconsulta no SQL ou recebo uma mensagem de erro.


5

Por meio do SSMS, criei um novo esquema:

  • Clicando na pasta Segurança no Pesquisador de Objetos no meu servidor,
  • Esquemas clicados com o botão direito
  • Selecionado "Novo esquema ..."
  • Nomeado meu novo esquema (exe no seu caso)
  • Hit OK

Encontrei este post para alterar o esquema, mas também estava recebendo o mesmo erro de permissão ao tentar mudar para o novo esquema. Como tenho vários bancos de dados listados no meu SSMS, tentei especificar o banco de dados e funcionou:

USE (yourservername)  
ALTER SCHEMA exe TRANSFER dbo.Employees 

3

Seu código é:

FROM
 dbo.Employees
TO
 exe.Employees

Eu tentei com esta consulta.

ALTER SCHEMA exe TRANSFER dbo.Employees

Apenas escreva create schema exee execute


3
CREATE SCHEMA exe AUTHORIZATION [dbo]
GO

ALTER SCHEMA exe
TRANSFER dbo.Employees
GO


0

Tenha muito cuidado ao renomear objetos no sql. Você pode causar falhas nas dependências, se você não estiver totalmente afastado do que está fazendo. Dito isto, isso funciona facilmente (demais) para renomear coisas, desde que você tenha acesso adequado ao ambiente:

exec sp_rename 'Nameofobject', 'ReNameofobject'

1
Infelizmente, isso não funcionará neste cenário, sp_rename funciona apenas para alterar o valor [nome] de um objeto. Você não pode alterar o esquema com ele. Se você tentou exec sp_rename 'dbo.Employees', 'exe.Employees'você teria o nome [dbo] [exe.Employees].
Eric J. Price

ALTER SCHEMA (Nome do esquema) TRANSFER (schemaName). (ObjectName);
djangojazz

Observe também que, quando você altera o esquema de uma tabela, qualquer Views que use essa tabela não será atualizada. Você precisará atualizar manualmente o texto (os nomes dos esquemas) nessas visualizações. (Suspiro ...)
Mike Gledhill

0

Verifique se você está no contexto de banco de dados correto no SSMS. Obtive o mesmo erro que você, mas eu sabia que o esquema já existia. Não sabia que eu estava no contexto 'MASTER'. O ALTER funcionou depois que eu mudei o contexto para meu banco de dados.


0

No caso, alguém procurando uma versão inferior -

Para o SQL Server 2000:

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.