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

Jonathan Hall
quelle

Antworten:

179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

Siehe ALTER SCHEMA .

Verallgemeinerte Syntax:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 
Remus Rusanu
quelle
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.

Patmortech
quelle
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
21
USE MyDB;
GO
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
GO

Ref: ALTER SCHEMA

Mitch Wheat
quelle
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
Neru-J
quelle
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.

Lanceomagnifico
quelle
Arbeitet ein Vergnügen. Vielen Dank.
BGX
2

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

Schema ändern dbo transfer jonathan.MovieData

Jon Onstott
quelle
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;
Hannover Faust
quelle
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]
MJ X.
quelle
1

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

ALTER SCHEMA schemaname TRANSFER securable_name


quelle