Bagaimana cara mengubah susunan Database SQL Server?

16

Saya mencoba untuk membakukan semua basis data pada satu susunan - Latin1_General_CI_AS (susunan standar). Saya memiliki beberapa database yang ada di SQL_Latin1_General_CP1_CI_AS.

Saya tahu saya bisa menggunakan ALTER DATABASE untuk mengubah susunan basis data, tetapi itu hanya memengaruhi objek baru. Pemahaman saya adalah bahwa satu-satunya cara untuk mengubah kolom yang ada adalah dengan melakukan ALTER COLUMN pada setiap kolom di setiap tabel - dan saya harus menghapus dan membuat ulang semua indeks untuk melakukan hal itu.

Saya kira itu akan terlihat seperti ini:

DROP INDEX indexname ON tablename

GO

ALTER TABLE tablename ALTER COLUMN columname varchar(50) COLLATE Latin1_General_CI_AS NULL

GO

CREATE CLUSTERED INDEX indexname ON tablename (columname ASC)

dan ulangi untuk setiap kolom varchar, char, teks, nvarchar, nchar dan ntext di seluruh database. Itu akan menjadi skrip SQL yang sangat besar .

Apakah ada cara yang lebih mudah untuk melakukan ini, atau adakah yang bisa menyarankan cara untuk mengotomatiskan pembuatan skrip SQL untuk melakukannya?

Richard Gadsden
sumber

Jawaban:

9

MS KB 325335 memiliki opsi tentang cara melakukan ini untuk seluruh db dan semua kolom.

Pada dasarnya:

  1. Tabel basis data skrip (dengan susunan baru)
  2. Data DTS / SSIS (menonton pemeriksaan)
  3. Tambahkan kendala
gbn
sumber
2

Sayangnya ini bukan tugas yang mudah di SQL Server.

Anda bisa menggunakan alat skrip seperti Redgate's SQL Compare untuk objek database yang ada (tabel, prosedur tersimpan, tampilan dll.) Jika Anda tidak memiliki lisensi, Anda bisa menggunakan percobaan gratis. Setelah Anda membuat database baru dengan susunan yang benar dan membangun kembali objek dari skrip Anda, Anda bisa menjalankan SSIS untuk mentransfer data dari satu database ke yang lain. Jika Anda memiliki banyak data, gunakan sisipan massal T-SQL.

Untuk memiliki susunan yang tepat untuk basis data masa depan di server itu, Anda bisa mengubah susunan default di server. Artikel MSDN berikut menjelaskan perubahan apa yang menggunakan klausa COLLATE dari ALTER DATABASE dan ALTER TABLE:

Mengatur dan Mengubah Database Collation (SQL Server 2008 Books Online)

Anda dapat mengubah susunan objek baru yang dibuat dalam database pengguna dengan menggunakan klausa COLLATE dari pernyataan ALTER DATABASE . Pernyataan ini tidak mengubah susunan kolom dalam tabel yang ditentukan pengguna yang ada. Ini dapat diubah dengan menggunakan klausa COLLATE dari ALTER TABLE .

Saat Anda mengubah susunan basis data, Anda mengubah hal berikut:

  • Pemeriksaan standar untuk basis data. Susunan standar baru ini diterapkan ke semua kolom, tipe data, variabel, dan parameter yang ditentukan pengguna yang selanjutnya dibuat dalam database. Ini juga digunakan ketika menyelesaikan pengidentifikasi objek yang ditentukan dalam pernyataan SQL terhadap objek yang didefinisikan dalam database.
  • Kolom char, varchar, teks, nchar, nvarchar, atau ntext dalam tabel sistem diubah ke susunan baru.
  • Semua parameter char, varchar, teks, nchar, nvarchar, atau ntext yang ada dan nilai pengembalian skalar untuk prosedur tersimpan dan fungsi yang ditentukan pengguna diubah ke susunan baru.
  • Char, varchar, teks, nchar, nvarchar, atau tipe data sistem ntext, dan semua tipe data yang ditentukan pengguna berdasarkan tipe data sistem ini, diubah ke susunan default yang baru.
percikan
sumber
1

Umumnya tidak disarankan untuk melakukan ini ke server langsung. Terakhir kali saya melihat, melakukan ini tidak secara resmi didukung oleh Microsoft. Untuk melakukan ini dalam praktiknya, Anda harus membuat instance baru dengan susunan yang benar dan memigrasikan databasenya.

Mengembalikan DB dengan ke server dengan susunan default yang berbeda menyebabkan semua jenis kesenangan karena tempdb akan memiliki susunan server baru, jadi ini juga tidak disarankan.

ConcernedOfTunbridgeWells
sumber
1

Coba utilitas ini , yang diberi basis data sumber akan menghasilkan semua skrip yang perlu diterapkan pada basis data target sehingga susunan diubah dengan aman.

Manea Florin
sumber
1

Anda dapat menggunakan tampilan Infomation_Schema untuk menghasilkan skrip dengan cukup mudah, tetapi saya tidak yakin ini adalah cara terbaik untuk menyelesaikan masalah Anda. Menciptakan kembali semua indeks pada db largish dapat mengambil banyak waktu / ruang log dll. Saya akan pergi dengan bermigrasi (tidak mengembalikan) ke contoh baru.

Dave Jackson
sumber