Saat ini kami memiliki banyak basis data tetapi ingin menggabungkannya dan, sebaliknya, memisahkan konteks domain kami menggunakan skema.
Dalam MS SQL Server 2008 R2, bagaimana saya bisa memindahkan semua konten dari satu skema ke yang lain secara massal?
Misalnya, semua tabel, tampilan, prosedur, indeks, dll ... yang kami buat dalam dbo
skema sekarang akan hidup dalam foo
skema.
EDIT: Saya ingin mengklarifikasi berdasarkan komentar hebat AaronBertrand. Ini bukan situasi multi-sewa. Situasi kami adalah di mana plugin alat internal dikembangkan secara terpisah oleh pengembang yang tidak menggabungkan tabel mereka ke dalam basis data alat.
sql-server-2008-r2
schema
Matius
sumber
sumber
Jawaban:
Konsep dasar sebenarnya cukup sederhana: Anda menghasilkan skrip dari
sys.objects
dansys.schemas
yang membangunALTER SCHEMA TRANSFER
pernyataan. Jadi misalnya, Anda memiliki tiga objek dalamdbo
skema, dan Anda ingin memindahkan semuanya keblat
skema:Kode berikut:
Akan menghasilkan skrip ini (tapi mungkin tidak dalam urutan ini):
(Anda mungkin ingin menambahkan filter tambahan untuk meninggalkan objek dalam
dbo
skema yang tidak ingin Anda pindahkan, tinggalkan tipe objek tertentu (mis. Mungkin semua fungsi Anda adalah fungsi utilitas dan tidak perlu bergerak), menghasilkan skrip diurutkan berdasarkan jenis objek, dll.)Tetapi ada beberapa masalah dengan memindahkan semua objek Anda ke skema baru:
Mungkin banyak kode Anda masih akan merujuk objek-objek ini
dbo.object
- tidak ada cara mudah untuk memperbaikinya kecuali kekerasan. Anda mungkin dapat menemukan semua kejadiandbo.
dengan cukup mudah, tetapi ini juga dapat mengembalikan positif palsu, sepertiEXEC dbo.sp_executesql
,dbo.
dalam komentar, referensi yang benar ke objek yang masih ada dalamdbo.
skema, dll.Ketergantungan Anda mungkin akan benar-benar rusak, tetapi saya belum benar-benar menguji ini. Saya tahu itu dalam skenario ini:
Kunci asing sebenarnya bermigrasi lebih lancar dari yang saya harapkan (dengan peringatan yang saya uji pada versi yang jauh lebih baru daripada Anda). Tetapi karena kode dalam
blat.pX
referensi masihdbo.bar
, jelas menjalankan prosedur:Akan menghasilkan kesalahan ini:
Dan pertanyaan ketergantungan, seperti:
Akan menghasilkan kesalahan ini:
Dan menanyakan tampilan:
Menghasilkan kesalahan ini:
Jadi, ini bisa melibatkan banyak pembersihan. Dan setelah Anda memperbaiki semua referensi objek, Anda mungkin ingin mengkompilasi ulang semua modul dan menyegarkan semua tampilan dalam skema baru. Anda dapat membuat skrip untuk itu sangat mirip dengan contoh di atas.
sumber