Come cambio lo schema db in dbo


115

Ho importato un mucchio di tabelle da un vecchio server sql (2000) nel mio database del 2008. Tutti i tavoli importati sono prefissati con il mio nome utente, ad esempio: jonathan.MovieData. Nella tabella propertieselenca jonathancome schema db. Quando scrivo stored procedure, ora devo includere jonathan.davanti a tutti i nomi di tabella che è fonte di confusione.

Come cambio tutte le mie tabelle in dbo invece di jonathan?

Risultato corrente: jonathan.MovieData

Risultato desiderato: dbo.MovieData

Risposte:


179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

Vedi ALTER SCHEMA .

Sintassi generalizzata:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 

12
Per risparmiare tempo per i googler: ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Co7e

1
Se l'utente ha una barra rovesciata, eseguire quanto segue: ALTER SCHEMA dbo TRANSFER "DOMAIN \ user" .tableName
PatricF

@PatricF Il citato identificatori regole si applicano ai nomi di schema così come a qualsiasi altro nome: [DOMAIN\user].[tableName]. In generale nella comunità di SQL Server vengono utilizzati gli identificatori tra virgolette Transact-SQL ( [e ]), da evitare a "meno che non vi sia un requisito specifico per esso.
Remus Rusanu

Poiché ha chiesto tutte le mie tabelle , controlla questo e questo per farlo in una sola dichiarazione, la speranza aiuta qualcuno.
shaijut

2
@leigero usa [e ], come ogni altro caso in cui vuoi essere preciso sul nome di un oggetto SQL. [domain\user123].TableName.
Remus Rusanu

40

Puoi eseguire quanto segue, che genererà una serie di istruzioni ALTER sCHEMA per tutti i tuoi talbi:

SELECT 'ALTER SCHEMA dbo TRANSFER ' + TABLE_SCHEMA + '.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'jonathan'

È quindi necessario copiare ed eseguire le istruzioni in Query Analyzer.

Ecco uno script precedente che lo farà anche per te, credo cambiando il proprietario dell'oggetto. Non l'ho provato nel 2008, però.

DECLARE @old sysname, @new sysname, @sql varchar(1000)

SELECT
  @old = 'jonathan'
  , @new = 'dbo'
  , @sql = '
  IF EXISTS (SELECT NULL FROM INFORMATION_SCHEMA.TABLES
  WHERE
      QUOTENAME(TABLE_SCHEMA)+''.''+QUOTENAME(TABLE_NAME) = ''?''
      AND TABLE_SCHEMA = ''' + @old + '''
  )
  EXECUTE sp_changeobjectowner ''?'', ''' + @new + ''''

EXECUTE sp_MSforeachtable @sql

Preso da questo sito .

Parla anche di fare lo stesso per i proc memorizzati se necessario.


Ho provato il secondo bit inutilmente, ma grazie per il link, lo esaminerò.
jonathan hall

Non sei riuscito a utilizzare la selezione INFORMATION_SCHEMA sopra per generare automaticamente tutte le tue istruzioni ALTER SCHEMA?
patmortech

Notare la seguente citazione dalla documentazione di INFORMATION_SCHEMA.TABLES : " Importante Non utilizzare le viste INFORMATION_SCHEMA per determinare lo schema di un oggetto. L'unico modo affidabile per trovare lo schema di un oggetto è interrogare la vista del catalogo sys.objects." Pertanto, l'esempio dovrebbe essere riscritto per utilizzare sys.tables(un sottoinsieme di sys.objects) invece.
Heinzi,


15

Sposta la tabella dallo schema dbo a MySchema:

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


Sposta la tabella da MySchema allo schema dbo:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable

9

Ho appena inviato questo a una domanda simile: In SQL Server 2005, come faccio a modificare lo "schema" di una tabella senza perdere alcun dato?


Un leggero miglioramento per l'eccellente risposta di sAeid ...

Ho aggiunto un exec per fare in modo che questo codice si autoeseguisse e ho aggiunto un'unione in alto in modo da poter cambiare lo schema di entrambe le tabelle E delle stored procedure:

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 trasferimenti di dati di studio visivo per modificare lo schema di destinazione ... ho finito per eseguirlo contro il ripristinato dump sul nuovo server per ottenere le cose come volevo.


Funziona a meraviglia. Grazie.
bgx


2

Modo per farlo per una cosa individuale:

alterare lo schema dbo transfer jonathan.MovieData


2

Ho avuto un problema simile ma il mio schema aveva una barra rovesciata. In questo caso, includi le parentesi attorno allo schema.

ALTER SCHEMA dbo TRANSFER [DOMAIN\jonathan].MovieData;

2

Apri SQL Server come account SA e fai clic su nuova query dopo le query seguenti

quindi fare clic su Esegui, ripristinerà tutto lo schema di proprietà sull'account SA

alter authorization on schema::[db_datareader] to [dbo]
alter authorization on schema::[db_datareader] to [db_datareader]
alter authorization on schema::[db_datawriter] to [dbo]
alter authorization on schema::[db_datawriter] to [db_datawriter]
alter authorization on schema::[db_securityadmin] to [dbo]
alter authorization on schema::[db_securityadmin] to [db_securityadmin]
alter authorization on schema::[db_accessadmin] to [dbo]
alter authorization on schema::[db_accessadmin] to [db_accessadmin]
alter authorization on schema::[db_backupoperator] to [dbo]
alter authorization on schema::[db_backupoperator] to [db_backupoperator]
alter authorization on schema::[db_ddladmin] to [dbo]
alter authorization on schema::[db_ddladmin] to [db_ddladmin]
alter authorization on schema::[db_owner] to [dbo]
alter authorization on schema::[db_owner] to [db_owner]

1

ms-help: //MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/0a760138-460e-410a-a3c1-d60af03bf2ed.htm

ALTER SCHEMA nome_schema TRANSFER nome_protezione

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.