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?

o campeão
fonte
4
Você criou o esquema exe ?
PinnyM
1
O esquema existe?
James Culshaw
Não, eu não criei. O que devo fazer para criá-lo?
theChampion
execute create schema: msdn.microsoft.com/pt-BR/library/ms189462%28v=sql.90%29.aspx
a_horse_with_no_name 18/13
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
Pandian
fonte
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
DevelopmentIsMyPassion
fonte
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.

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

user2599599
fonte
3
CREATE SCHEMA exe AUTHORIZATION [dbo]
GO

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

billmack30
fonte
0

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

Para o SQL Server 2000:

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

iravinandan
fonte