it-swarm.it

In SQL Server 2005, come posso modificare lo "schema" di una tabella senza perdere alcun dato?

Ho una tabella che è entrata nello schema "db_owner" e ne ho bisogno nello schema "dbo".

C'è uno script o un comando da eseguire per cambiarlo?

72
DevelopingChris

In SQL Server Management Studio:

  1. Fai clic destro sulla tabella e seleziona modifica (ora si chiama "Design")
  2. Nel pannello delle proprietà scegliere lo schema proprietario corretto.
80
Jason Punyon
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]
83
Stephen Wrighton

Mostra tutto TABLE_SCHEMA con questa selezione:

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 

È possibile utilizzare questa query per modificare tutto lo schema di tutte le tabelle in dbo schema tabella:

DECLARE cursore CURSOR FOR 

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA <> 'dbo' 


DECLARE @schema sysname, 
 @tab sysname, 
 @sql varchar(500) 


OPEN cursore     
FETCH NEXT FROM cursore INTO @schema, @tab 

WHILE @@FETCH_STATUS = 0     
BEGIN 
 SET @sql = 'ALTER SCHEMA dbo TRANSFER ' + @schema + '.' + @tab     
 PRINT @sql     
 FETCH NEXT FROM cursore INTO @schema, @tab     
END 

CLOSE cursore     
DEALLOCATE cursore
12

risposta semplice

sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'

non è necessario interrompere tutte le connessioni al database, questo può essere fatto al volo.

7
Jeremy

A lieve miglioramento alla risposta eccellente di sAeid ...

Ho aggiunto un exec per far eseguire automaticamente questo codice, e ho aggiunto un'unione in alto in modo da poter cambiare lo schema di entrambe le tabelle E le procedure memorizzate:

DECLARE cursore CURSOR FOR 


select specific_schema as 'schema', specific_name AS 'name'
FROM INFORMATION_SCHEMA.routines
WHERE specific_schema <> 'dbo' 

UNION ALL

SELECT TABLE_SCHEMA AS 'schema', TABLE_NAME AS 'name'
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA <> 'dbo' 



DECLARE @schema sysname, 
 @tab sysname, 
 @sql varchar(500) 


OPEN cursore     
FETCH NEXT FROM cursore INTO @schema, @tab 

WHILE @@FETCH_STATUS = 0     
BEGIN 
 SET @sql = 'ALTER SCHEMA dbo TRANSFER [' + @schema + '].[' + @tab +']'    
 PRINT @sql   
 exec (@sql)  
 FETCH NEXT FROM cursore INTO @schema, @tab     
END 

CLOSE cursore     
DEALLOCATE cursore

Anch'io ho dovuto ripristinare un dbdump, e ho scoperto che lo schema non era dbo - ho passato ore a cercare di ottenere lo studio di gestione di SQL Server o i trasferimenti di dati di Visual Studio per modificare lo schema di destinazione ... Ho finito per eseguire questo contro il ripristino scaricare sul nuovo server per ottenere le cose come volevo.

5
Lanceomagnifico

Quando utilizzo SQL Management Studio non ottengo l'opzione "Modifica", ma solo "Progettazione" o "Modifica". Se hai Visual Studio (ho verificato VS.NET 2003, 2005 e 2008) puoi utilizzare Esplora server per modificare lo schema. Fare clic con il tasto destro del mouse sulla tabella e selezionare 'Design Table' (2008) o 'Open Table Definition' (2003, 2005). Evidenzia la colonna "Nome colonna" completa. È quindi possibile fare clic con il pulsante destro del mouse e selezionare "Pagine delle proprietà" o Proprietà (2008). Dalla finestra delle proprietà dovresti vedere il "Proprietario" (2003 e 2005) o "Schema" (2008) con un elenco a discesa per possibili schemi.

4
Anthony K

Lo uso per situazioni in cui un gruppo di tabelle deve trovarsi in uno schema diverso, in questo caso lo schema dbo.

declare @sql varchar(8000)
;

select
  @sql = coalesce( @sql, ';', '') + 'alter schema dbo transfer [' + s.name + '].[' + t.name + '];'
from 
  sys.tables t
  inner join
  sys.schemas s on t.[schema_id] = s.[schema_id]
where 
  s.name <> 'dbo'
;

exec( @sql )
;
2
Oliver