Db şemasını dbo olarak nasıl değiştiririm


115

Eski bir sql sunucusundan (2000) bir grup tabloyu 2008 veritabanıma aktardım. Tüm ithal tablolar, örneğin kullanıcı adım: kodu bulunmaktadır jonathan.MovieData. Tabloda db şeması olarak propertieslistelenir jonathan. Depolanan yordamları yazdığımda artık jonathan.kafa karıştırıcı olan tüm tablo adlarının önüne eklemem gerekiyor.

Jonathan yerine tüm tablolarımı dbo olacak şekilde nasıl değiştirebilirim?

Mevcut sonuç: jonathan.MovieData

İstenen sonuç: dbo.MovieData

Yanıtlar:


179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

ALTER SCHEMA'ya bakın .

Genelleştirilmiş Sözdizimi:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 

12
Google çalışanlarına zaman kazandırmak için: ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Co7e

1
Kullanıcının ters eğik çizgisi varsa aşağıdakileri çalıştırın: ALTER SCHEMA dbo TRANSFER "DOMAIN \ user" .tableName
PatricF

@PatricF tanımlayıcıları alıntı kurallar tıpkı diğer adıyla şema adlarına uygulanır: [DOMAIN\user].[tableName]. Genelde SQL Server topluluğunda Transact-SQL alıntı tanımlayıcıları kullanılır ( [ve ]), "bunun için özel bir gereksinim olmadıkça kaçının .
Remus Rusanu

O istedi gibi tüm Tablolar , kontrol bu ve bu tek deyiminde yapmak, umut bazı biri yardımcı olur.
shaijut

2
@leigero kullanımı [ve ]diğer herhangi bir vaka gibi, bir SQL nesne isim hakkında kesin olmak istediğinizde. [domain\user123].TableName.
Remus Rusanu

40

Aşağıdakileri çalıştırabilirsiniz, bu da tüm talblarınız için bir dizi ALTER sCHEMA ifadesi oluşturacaktır:

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

Daha sonra sorgu analizcisindeki ifadeleri kopyalayıp çalıştırmanız gerekir.

İşte bunu sizin için yapacak daha eski bir betik, sanırım nesne sahibini değiştirerek. Yine de 2008'de denemedim.

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

Bu siteden aldım .

Ayrıca, gerekirse depolanan işlemler için de aynısını yapmaktan bahsediyor.


İkinci kısmı boşuna denedim, ancak bağlantı için teşekkürler, onu inceleyeceğim.
jonathan hall

Tüm ALTER SCHEMA ifadelerinizi otomatik olarak oluşturmak için yukarıdaki INFORMATION_SCHEMA seçimini kullanamadınız mı?
patmortech

INFORMATION_SCHEMA.TABLES belgelerinden şu alıntıya dikkat edin : " Önemli Bir nesnenin şemasını belirlemek için INFORMATION_SCHEMA görünümlerini kullanmayın. Bir nesnenin şemasını bulmanın tek güvenilir yolu, sys.objects katalog görünümünü sorgulamaktır." Bu nedenle, bunun yerine örnek sys.tables(sys.objects'in bir alt kümesi) kullanmak için yeniden yazılmalıdır .
Heinzi


15

Tabloyu dbo şemasından MySchema'ya taşıyın:

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


Tabloyu MySchema'dan dbo şemasına taşıyın:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable

9

Bunu benzer bir soruya az önce gönderdim: sql server 2005'te bir tablonun "şemasını" herhangi bir veri kaybetmeden nasıl değiştirebilirim?


Bir hafif Saeid mükemmel cevabı iyileştirme ...

Bu kodun kendi kendine çalışmasını sağlamak için bir exec ekledim ve her iki tablonun VE saklı yordamların şemasını değiştirebilmem için en üste bir birleşim ekledim:

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

Ben de bir dbdump'ı geri yüklemek zorunda kaldım ve şemanın dbo olmadığını gördüm - Hedef şemayı değiştirmek için Sql Server yönetim stüdyosu veya görsel stüdyo veri aktarımlarını almaya çalışırken saatler harcadım ... Bunu sadece geri yüklenenlere karşı çalıştırdım. her şeyi istediğim gibi almak için yeni sunucuya dök.


Bir tedavi işe yarar. Teşekkürler.
bgx


2

Bunu bireysel bir şey için yapmanın yolu:

şema dbo aktarımını değiştir jonathan.MovieData


2

Benzer bir sorun yaşadım ama şemamda ters eğik çizgi vardı. Bu durumda, şema etrafına köşeli parantezler ekleyin.

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

2

SQL Server'ı SA hesabı olarak açın ve aşağıdaki sorguların ardından yeni sorguya tıklayın

ardından çalıştır'a tıklayın, sahip olunan tüm şemayı SA hesabına geri döndürecektir

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 schema_name TRANSFER güvenli_adı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.