Cambia lo schema nome della tabella in SQL


175

Voglio cambiare il nome dello schema della tabella Employeesnel database. Nella tabella corrente il Employeesnome dello schema del database è dboVoglio cambiarlo in exe. Come posso farlo ?

Esempio:

A PARTIRE DAL

dbo.Employees

PER

exe.Employees

Ho provato con questa query:

ALTER SCHEMA exe TRANSFER dbo.Employees

Ma questo mi dà un errore:

Impossibile modificare lo schema "exe", perché non esiste o non si dispone dell'autorizzazione.

Cosa mi sono perso?



1
Lo schema exe esiste?
James Culshaw,

No, non ho creato. Cosa devo fare per crearlo?
theChampion


Ho visto questo articolo ma è poco confuso. Puoi mostrarmi come creare lo schema nella mia situazione?
theChampion

Risposte:


272

Crea schema:

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

Schema ALTER:

ALTER SCHEMA exe 
    TRANSFER dbo.Employees

3
Puoi spiegarci cos'è sys.scemas e la funzione EXEC (...)?
theChampion

10
sys.schemasè una tabella che contiene tutti gli schemi per il database. Exec ('...') esegue solo una chiamata SQL dinamica, in questo caso è necessario perché un comando CREATE SCHEMA deve essere la prima istruzione in un batch di query e l'esecuzione come SQL dinamico consente di ottenere questo.
Eric J. Price,

Per tutte le tabelle , controlla questo e questo per farlo in una sola istruzione, la speranza aiuta qualcuno.
Shaijut,

L'uso dello schema alter sembra estremamente lento. (L'ho interrotto dopo 3 minuti per trasferire un tavolino con 300 righe.) Invece, ho usato select * in exe.Employees from dbo.Employees
fivelements

29

Prova di seguito

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

Ho dovuto usare set @sql = 'alter schema [' + @newschema + '] transfer [' + @oldschema + '].' + @tableper assicurarsi che alcune parole / caratteri speciali non causassero errori.
Stoinov,

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

Devo sempre usare le parentesi quadre quando utilizzo la ALTER SCHEMAquery in SQL o ricevo un messaggio di errore.


5

Tramite SSMS, ho creato un nuovo schema da:

  • Facendo clic sulla cartella Sicurezza in Esplora oggetti nel mio server,
  • schemi cliccati con il tasto destro
  • Selezionato "Nuovo schema ..."
  • Chiamato il mio nuovo schema (exe nel tuo caso)
  • Premi OK

Ho trovato questo post per cambiare lo schema, ma stavo anche ottenendo lo stesso errore di autorizzazioni quando provavo a passare al nuovo schema. Ho diversi database elencati nel mio SSMS, quindi ho appena provato a specificare il database e ha funzionato:

USE (yourservername)  
ALTER SCHEMA exe TRANSFER dbo.Employees 

3

Il tuo codice è:

FROM
 dbo.Employees
TO
 exe.Employees

Ho provato con questa domanda.

ALTER SCHEMA exe TRANSFER dbo.Employees

Basta scrivere create schema exeed eseguirlo


3
CREATE SCHEMA exe AUTHORIZATION [dbo]
GO

ALTER SCHEMA exe
TRANSFER dbo.Employees
GO


0

Fai molta attenzione a rinominare gli oggetti in sql. È possibile che le dipendenze falliscano se non si è completamente assenti da ciò che si sta facendo. Detto questo, questo funziona facilmente (troppo) per rinominare le cose purché tu abbia un accesso adeguato all'ambiente:

exec sp_rename 'Nameofobject', 'ReNameofobject'

1
Sfortunatamente questo non funzionerà in questo scenario, sp_rename funziona solo per cambiare il valore [name] di un oggetto. Non è possibile modificare lo schema con esso. Se ci provassi exec sp_rename 'dbo.Employees', 'exe.Employees'otterresti il ​​nome [dbo]. [Exe.Employees]
Eric J. Price

ALTER SCHEMA (Nome dello schema) TRANSFER (schemaName). (ObjectName);
Djangojazz,

Si noti inoltre che quando si modifica lo schema di una tabella, le viste che utilizzano tale tabella non verranno aggiornate. Dovrai aggiornare manualmente il testo (i nomi dello schema) in queste viste. (Sospiro ...)
Mike Gledhill,

0

Assicurati di essere nel giusto contesto di database in SSMS. Ho avuto lo stesso errore, ma sapevo che lo schema esisteva già. Non mi ero reso conto che ero nel contesto di "MASTER". ALTER ha funzionato dopo aver modificato il contesto nel mio database.


0

Nel caso, qualcuno in cerca di versione inferiore -

Per SQL Server 2000:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.