Wie ändere ich das Datenbankschema in dbo?


115

Ich habe eine Reihe von Tabellen von einem alten SQL-Server (2000) in meine 2008-Datenbank importiert. Allen importierten Tabellen wird mein Benutzername vorangestellt, zum Beispiel : jonathan.MovieData. In der Tabelle wird propertieses jonathanals Datenbankschema aufgeführt. Wenn ich gespeicherte Prozeduren schreibe, muss ich jetzt jonathan.vor allen Tabellennamen einfügen, was verwirrend ist.

Wie ändere ich alle meine Tabellen auf dbo anstelle von jonathan?

Aktuelles Ergebnis: jonathan.MovieData

Erwünschtes Ergebnis: dbo.MovieData

Antworten:


179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

Siehe ALTER SCHEMA .

Verallgemeinerte Syntax:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 

12
So sparen Sie Zeit für Googler: ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Co7e

1
Wenn der Benutzer einen Backslash hat, führen Sie Folgendes aus: ALTER SCHEMA dbo TRANSFER "DOMAIN \ user" .tableName
PatricF

@PatricF Die Regeln für zitierte Bezeichner gelten für Schemanamen genauso wie für alle anderen Namen : [DOMAIN\user].[tableName]. Im Allgemeinen werden in der SQL Server-Community die in Transact-SQL angegebenen Bezeichner verwendet ( [und ]). Vermeiden Sie dies, es "sei denn , es gibt eine bestimmte Anforderung dafür.
Remus Rusanu

Da er nach all meinen Tabellen gefragt hat , überprüfen Sie dies und das , um es in einer einzigen Aussage zu tun. Die Hoffnung hilft jemandem.
Shaijut

2
@leigero verwenden [und ], wie in jedem anderen Fall, wenn Sie einen SQL-Objektnamen präzisieren möchten. [domain\user123].TableName.
Remus Rusanu

40

Sie können Folgendes ausführen, wodurch eine Reihe von ALTER sCHEMA-Anweisungen für alle Ihre Talbes generiert wird:

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

Anschließend müssen Sie die Anweisungen in Query Analyzer kopieren und ausführen.

Hier ist ein älteres Skript, das das auch für Sie erledigt, denke ich, indem Sie den Objektbesitzer ändern. Ich habe es 2008 noch nicht versucht.

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

Habe es von dieser Seite bekommen .

Es geht auch darum, dasselbe für gespeicherte Prozesse zu tun, wenn Sie dies benötigen.


Ich habe das zweite Bit ohne Erfolg versucht, aber danke für den Link, ich werde es untersuchen.
Jonathan Hall

Konnten Sie mit der obigen Auswahl INFORMATION_SCHEMA nicht alle Ihre ALTER SCHEMA-Anweisungen automatisch generieren?
Patmortech

Beachten Sie das folgende Zitat aus der Dokumentation von INFORMATION_SCHEMA.TABLES : " Wichtig Verwenden Sie keine INFORMATION_SCHEMA-Ansichten, um das Schema eines Objekts zu bestimmen. Die einzige zuverlässige Möglichkeit, das Schema eines Objekts zu finden, besteht darin, die Katalogansicht sys.objects abzufragen." Daher sollte das Beispiel neu geschrieben werden, um sys.tablesstattdessen (eine Teilmenge von sys.objects) zu verwenden.
Heinzi


15

Verschieben Sie die Tabelle vom dbo-Schema nach MySchema:

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


Verschieben Sie die Tabelle von MySchema in das Dbo-Schema:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable

9

Ich habe dies gerade auf eine ähnliche Frage gestellt: Wie ändere ich in SQL Server 2005 das "Schema" einer Tabelle, ohne Daten zu verlieren?


Eine leichte Verbesserung der hervorragenden Antwort von sAeid ...

Ich habe eine Exec hinzugefügt, damit sich dieser Code selbst ausführt, und oben eine Union hinzugefügt, damit ich das Schema beider Tabellen UND gespeicherter Prozeduren ändern kann:

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

Auch ich musste einen Datenbankauszug wiederherstellen und stellte fest, dass das Schema nicht dbo war. Ich habe stundenlang versucht, Sql Server Management Studio- oder Visual Studio-Datenübertragungen zu erhalten, um das Zielschema zu ändern. Am Ende habe ich dies nur für das wiederhergestellte ausgeführt Dump auf dem neuen Server, um die Dinge so zu bekommen, wie ich es wollte.


Arbeitet ein Vergnügen. Vielen Dank.
BGX


2

Weg, es für eine individuelle Sache zu tun:

Schema ändern dbo transfer jonathan.MovieData


2

Ich hatte ein ähnliches Problem, aber mein Schema hatte einen Backslash. Fügen Sie in diesem Fall die Klammern um das Schema ein.

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

2

Öffnen Sie SQL Server als SA-Konto und klicken Sie nach den folgenden Abfragen auf eine neue Abfrage

Klicken Sie dann auf Ausführen. Das gesamte Schema wird auf das SA-Konto zurückgesetzt

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 schemaname TRANSFER securable_name

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.