Jak zmienić schemat db na dbo


115

Zaimportowałem kilka tabel ze starego serwera sql (2000) do mojej bazy danych z 2008 roku. Wszystkie importowane stoliki są poprzedzone moją nazwą użytkownika, na przykład: jonathan.MovieData. W tabeli propertiesjest wymieniony jonathanjako schemat db. Kiedy piszę procedury składowane, muszę teraz umieszczać jonathan.przed wszystkimi nazwami tabel, co jest mylące.

Jak zmienić wszystkie moje tabele na dbo zamiast jonathan?

Aktualny wynik: jonathan.MovieData

Pożądany rezultat: dbo.MovieData

Odpowiedzi:


179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

Zobacz ALTER SCHEMA .

Uogólniona składnia:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 

12
Aby zaoszczędzić czas Googlersom: ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Co7e

1
Jeśli użytkownik ma ukośnik odwrotny, wykonaj następujące czynności: ALTER SCHEMA dbo TRANSFER "DOMENA \ użytkownik" .tableName
PatricF

@PatricF identyfikatorów w cudzysłowach zasady stosuje się do nazw schematów, tak jak do każdej innej nazwy: [DOMAIN\user].[tableName]. Ogólnie w społeczności SQL Server używane są identyfikatory cytowane w języku Transact-SQL ( [i ]), których należy unikać, "chyba że jest to określone wymaganie.
Remus Rusanu

Ponieważ prosił o wszystkie moje tabele , sprawdź to i to, aby zrobić to w jednym oświadczeniu, nadzieja komuś pomoże.
shaijut

2
@leigero użyj [i ], jak w każdym innym przypadku, gdy chcesz być precyzyjny w nazwie obiektu SQL. [domain\user123].TableName.
Remus Rusanu

40

Możesz uruchomić następujące polecenie, które wygeneruje zestaw instrukcji ALTER sCHEMA dla wszystkich twoich talb:

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

Następnie musisz skopiować i uruchomić instrukcje w analizatorze zapytań.

Oto starszy skrypt, który zrobi to za Ciebie, myślę, że zmieniając właściciela obiektu. Jednak nie próbowałem tego w 2008 roku.

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

Mam to z tej strony .

Mówi również o zrobieniu tego samego dla przechowywanych procesów, jeśli zajdzie taka potrzeba.


Próbowałem drugiego kawałka bez skutku, ale dzięki za link, przyjrzę się temu.
jonathan hall

Czy nie udało Ci się użyć powyższej opcji INFORMATION_SCHEMA do automatycznego wygenerowania wszystkich wyciągów ALTER SCHEMA?
patmortech

Zwróć uwagę na następujący cytat z dokumentacji INFORMATION_SCHEMA.TABLES : Ważne Nie używaj widoków INFORMATION_SCHEMA do określenia schematu obiektu. Jedynym niezawodnym sposobem znalezienia schematu obiektu jest wysłanie zapytania do widoku katalogu sys.objects”. Dlatego przykład należy przepisać, aby sys.tableszamiast tego używał (podzbioru sys.objects).
Heinzi,


15

Przenieś tabelę ze schematu dbo do MySchema:

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


Przenieś tabelę z MySchema do schematu dbo:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable

9

Właśnie wysłałem to do podobnego pytania: Jak w sql server 2005 mogę zmienić "schemat" tabeli bez utraty danych?


Niewielka poprawa na doskonałą odpowiedź saeid za ...

Dodałem exec, aby ten kod był samowykonalny, i dodałem u góry u góry, aby móc zmienić schemat obu tabel ORAZ procedur składowanych:

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

Ja też musiałem przywrócić dbdump i odkryłem, że schemat nie był dbo - spędziłem godziny próbując uzyskać transfer danych Sql Server Management Studio lub Visual Studio w celu zmiany schematu docelowego ... Skończyło się na tym, że uruchomiłem to na przywróconym zrzuć na nowy serwer, aby uzyskać sposób, w jaki chciałem.


Działa wspaniale. Dzięki.
bgx


2

Sposób na zrobienie tego dla indywidualnej rzeczy:

zmiana schematu dbo transfer jonathan.MovieData


2

Miałem podobny problem, ale mój schemat zawierał odwrotny ukośnik. W takim przypadku umieść nawiasy wokół schematu.

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

2

Otwórz SQL Server jako konto SA i kliknij nowe zapytanie obok poniższych zapytań

następnie kliknij Wykonaj, przywróci cały posiadany schemat z powrotem do konta 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 nazwa_schematu TRANSFER nazwa_sekuracji

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.