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?
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?
Antworten:
In SQL Server Management Studio:
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]
OldSchema.Table1
nach umzubenennen NewSchema.Table1
.
Alle TABLE_SCHEMA
anzeigen 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
PRINT @sql
dass geändert werden sollte, umEXEC(@sql)
einfache Antwort
sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'
Sie müssen nicht alle Verbindungen zur Datenbank beenden, dies kann im laufenden Betrieb erfolgen.
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.
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.
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 )
;
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.