Bagaimana cara mengubah skema db ke dbo

115

Saya mengimpor banyak tabel dari server sql lama (2000) ke database 2008 saya. Semua tabel impor diawali dengan nama pengguna saya, misalnya: jonathan.MovieData. Dalam tabel propertiesini tercantum jonathansebagai skema db. Ketika saya menulis prosedur tersimpan, sekarang saya harus menyertakan jonathan.di depan semua nama tabel yang membingungkan.

Bagaimana cara mengubah semua tabel saya menjadi dbo, bukan jonathan?

Hasil saat ini: jonathan.MovieData

Hasil yang diinginkan: dbo.MovieData

jonathan hall
sumber

Jawaban:

179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

Lihat ALTER SCHEMA .

Sintaks Umum:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 
Remus Rusanu
sumber
12
Untuk menghemat waktu bagi Googler: ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Co7e
1
Jika pengguna memiliki garis miring terbalik, jalankan perintah berikut: ALTER SCHEMA dbo TRANSFER "DOMAIN \ user" .tableName
PatricF
@PatricF The dikutip pengidentifikasi aturan berlaku untuk nama skema seperti ke nama lain: [DOMAIN\user].[tableName]. Secara umum dalam komunitas SQL Server, pengenal yang dikutip dari Transact-SQL digunakan ( [dan ]), hindari "kecuali jika ada persyaratan khusus untuk itu.
Remus Rusanu
Saat Dia meminta semua Tabel saya , periksa ini dan ini untuk melakukannya dalam satu pernyataan, harapan membantu seseorang.
shaijut
2
@leigero digunakan [dan ], seperti kasus lain ketika Anda ingin lebih tepat tentang nama objek SQL. [domain\user123].TableName.
Remus Rusanu
40

Anda dapat menjalankan perintah berikut, yang akan menghasilkan sekumpulan pernyataan ALTER sCHEMA untuk semua talbes Anda:

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

Anda kemudian harus menyalin dan menjalankan pernyataan di query analyzer.

Berikut ini skrip lama yang akan melakukannya untuk Anda juga, menurut saya dengan mengubah pemilik objek. Belum mencobanya pada tahun 2008.

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

Mengerti dari situs ini .

Ini juga berbicara tentang melakukan hal yang sama untuk procs yang disimpan jika Anda perlu.

patmortech.dll
sumber
Saya mencoba bit kedua tetapi tidak berhasil, tetapi terima kasih untuk tautannya, saya akan memeriksanya.
jonathan hall
Apakah Anda tidak dapat menggunakan pilihan INFORMATION_SCHEMA di atas untuk membuat semua pernyataan ALTER SCHEMA Anda secara otomatis?
patmortech
Perhatikan kutipan berikut dari dokumentasi INFORMATION_SCHEMA.TABLES : " Penting Jangan gunakan tampilan INFORMATION_SCHEMA untuk menentukan skema objek. Satu-satunya cara yang dapat diandalkan untuk menemukan skema objek adalah dengan query tampilan katalog sys.objects." Jadi, contoh tersebut harus ditulis ulang untuk digunakan sys.tables(bagian dari sys.objects) sebagai gantinya.
Heinzi
21
USE MyDB;
GO
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
GO

Ref: ALTER SCHEMA

Mitch Wheat
sumber
15

Pindahkan tabel dari skema dbo ke MySchema:

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


Pindahkan tabel dari MySchema ke skema dbo:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable
Neru-J
sumber
9

Saya baru saja memposting ini ke pertanyaan serupa: Di sql server 2005, bagaimana cara mengubah "skema" tabel tanpa kehilangan data?


Sebuah sedikit perbaikan untuk jawaban Saeid ini sangat baik ...

Saya menambahkan seorang eksekutif agar kode ini dieksekusi sendiri, dan saya menambahkan gabungan di bagian atas sehingga saya dapat mengubah skema kedua tabel DAN prosedur tersimpan:

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

Saya juga harus memulihkan dbdump, dan menemukan bahwa skemanya bukan dbo - Saya menghabiskan berjam-jam mencoba untuk mendapatkan studio manajemen Sql Server atau transfer data studio visual untuk mengubah skema tujuan ... Saya akhirnya hanya menjalankan ini terhadap yang dipulihkan membuang di server baru untuk mendapatkan hal-hal seperti yang saya inginkan.

Lanceomagnifico
sumber
Bekerja dengan baik. Terima kasih.
bgx
2

Cara melakukannya untuk hal individu:

mengubah skema dbo transfer jonathan.MovieData

Jon Onstott
sumber
2

Saya memiliki masalah serupa tetapi skema saya memiliki garis miring terbalik di dalamnya. Dalam kasus ini, sertakan tanda kurung di sekitar skema.

ALTER SCHEMA dbo TRANSFER [DOMAIN\jonathan].MovieData;
Hannover Fist
sumber
2

Buka SQL Server sebagai akun SA dan klik kueri baru setelah kueri di bawah ini

lalu klik jalankan, itu akan mengembalikan semua skema yang dimiliki kembali ke akun 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]
MJ X
sumber
1

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

ALTER SCHEMA schema_name TRANSFER securable_name


sumber