Wie ändere ich in SQL Server 2005 das „Schema“ einer Tabelle, ohne Daten zu verlieren?

74

Ich habe eine Tabelle, die in das Schema "db_owner" aufgenommen wurde, und ich brauche sie im Schema "dbo".

Gibt es ein Skript oder einen Befehl zum Umschalten?

Entwicklung von Chris
quelle
5
Pedanterie: * verlieren Bitte Korrektur lesen.
GEOCHET

Antworten:

84

In SQL Server Management Studio:

  1. Klicken Sie mit der rechten Maustaste auf die Tabelle und wählen Sie Ändern (sie heißt jetzt "Design").
  2. Wählen Sie im Eigenschaftenfenster das richtige Besitzschema aus.
Jason Punyon
quelle
6
danke, lustig, wenn du nur mit der rechten Maustaste klickst -> Eigenschaften, ist das Schema unveränderlich, also nahm ich an, dass es eine dieser befehlsbezogenen Ninja-Aufgaben war. Ich bin froh zu wissen, dass es nicht so schmerzhaft ist, wie es sich anfühlte.
DevelopingChris
2
Abhängig von der verwendeten Version von SQL Server Management Studio wird "Ändern" möglicherweise als "Design" bezeichnet.
CJBarth
3
Wenn Sie nur das Fenster "Spalteneigenschaften" sehen. Gehen Sie zu Ansicht und wählen Sie "Eigenschaftenfenster". Vergessen Sie nach der Bearbeitung nicht, Ihre Änderungen zu speichern.
Jonas Äppelgran
84
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]
Stephen Wrighton
quelle
Dies scheint die Tabelle in SQL Server Management Studio nicht von OldSchema.Table1nach umzubenennen NewSchema.Table1.
Sanchit
3
Haben Sie die Tabellenliste aktualisiert? Ich habe festgestellt, dass Management Studio die Datenbankliste in der Regel nicht aktualisiert, um Änderungen widerzuspiegeln, die über tsql vorgenommen wurden (im Gegensatz zur Auswahl der Tabelle und Verwendung der integrierten Tools), es sei denn, Sie erzwingen dies. Oder Sie trennen / verbinden erneut.
Stephen Wrighton
Ja. Es ist definitiv nur eine visuelle Sache, obwohl SQL Server mich glauben lässt, dass es nicht so ist. Wenn Sie nach dem Ausführen Ihres Befehls und Aktualisieren und so weiter mit der rechten Maustaste auf die Tabelle in der Entwurfsansicht klicken und dann das Schema im Eigenschaftenfenster von oldSchema in newSchema ändern, wird der Tabellenname aktualisiert (zusammen mit einer Warnmeldung). Ich hoffe nur, dass dies eine GUI-Entsprechung Ihres Befehls ist und nicht etwas völlig anderes. Gibt es eine Möglichkeit zu überprüfen?
Sanchit
12

Alle TABLE_SCHEMAanzeigen durch diese Auswahl:

SELECT TABLE_SCHEMA, TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 

Mit dieser Abfrage können Sie das gesamte Schema für alle Tabellen in das dbo-Tabellenschema ändern:

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
sAeid mOhammad hAshem
quelle
1
Das funktioniert super. Beachten Sie, PRINT @sqldass geändert werden sollte, umEXEC(@sql)
7.
7

einfache Antwort

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

Sie müssen nicht alle Verbindungen zur Datenbank beenden, dies kann im laufenden Betrieb erfolgen.

Jeremy
quelle
1
Technisch ja. Es ist immer noch in Denali und funktioniert gut für das, was OP verlangt hat. Sie sagen immer, dass sie es entfernen werden, aber sie tun es nie.
Jeremy
5

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 Datenbankspeicherauszug 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 Dump auf dem neuen Server, um die Dinge so zu bekommen, wie ich es wollte.

Lanceomagnifico
quelle
Gute Antwort! +1 für das Einbeziehen von Routinen. Meine DB hatte sie auch enthalten. Es gibt auch Systemobjekte VIEWs und FUNCTIONs mit einem Schemafeld. Aber in meinem Fall waren sie alle im 'dbo'-Schema.
Sieben
4

Wenn ich SQL Management Studio verwende, erhalte ich nicht die Option "Ändern", sondern nur "Design" oder "Bearbeiten". Wenn Sie über Visual Studio verfügen (ich habe VS.NET 2003, 2005 und 2008 überprüft), können Sie das Schema mit dem Server-Explorer ändern. Klicken Sie mit der rechten Maustaste auf die Tabelle und wählen Sie "Designtabelle" (2008) oder "Tabellendefinition öffnen" (2003, 2005). Markieren Sie die vollständige Spalte "Spaltenname". Sie können dann mit der rechten Maustaste klicken und "Eigenschaftenseiten" oder "Eigenschaften" (2008) auswählen. Auf dem Eigenschaftenblatt sollten Sie den 'Eigentümer' (2003 & 2005) oder 'Schema' (2008) mit einer Dropdown-Liste für mögliche Schemata sehen.

Anthony K.
quelle
2

Ich verwende dies für Situationen, in denen sich eine Reihe von Tabellen in einem anderen Schema befinden müssen, in diesem Fall im dbo-Schema.

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 )
;
Oliver
quelle
-3

Sie müssen zuerst alle Verbindungen zur Datenbank beenden und den Besitz der Tabellen 'db_owner' ändern, indem Sie den Befehl ausführen

sp_MSforeachtable @command1="sp_changeobjectowner ""?"",'dbo'"

wo ? ist der Tabellenname.

Craig
quelle
Der sp_changedbowner-Prozess ist veraltet und der sp_MSforeachtable ist nicht vertrauenswürdig, ebenso wie die sp_MSforeachdatabase. Ich habe Bertrands Version verwendet
Oliver