Bagaimana mengubah susunan SQL Server

27

Bagaimana saya bisa mengubah SQL Server 2008 R2 Express Default Collation untuk seluruh server dan database tertentu?

Apakah ada cara untuk melakukannya dengan menggunakan antarmuka visual dari SQL Server Management Studio? Di jendela Properti Server (dan di jendela Properti Database yang sesuai), properti ini tidak tersedia untuk diedit.

rem
sumber
2
Jika Anda ingin mengubah susunan semua kolom dalam basis data, lihat skrip ini . Saya belum mencobanya sendiri, tetapi saya menemukannya untuk rekan kerja yang ingin melakukan hal itu.
Justin Dearing
2
Jika Anda ingin mengubah susunan basis data, lihat alat ini: codeproject.com/KB/database/ChangeCollation.aspx Ini berfungsi dengan SQL Server 2005 dan 2008 dan telah bekerja lebih baik untuk saya daripada skrip yang mungkin Anda temukan di web.
Erwin

Jawaban:

25

Iya nih.

Anda bisa mengubah susunan default contoh SQL Server 2008 R2 express dan database individual, tetapi ini adalah tugas yang kompleks.

Sayangnya, tidak ada opsi visual untuk melakukannya melalui SSMS.

SQL Server 2008 mendukung pengaturan kumpulan di level berikut:

  • Server

  • Basis data

  • Kolom

  • Ekspresi

Pengaturan instalasi default ditentukan oleh lokal sistem Windows. Susunan tingkat server dapat diubah selama pengaturan, atau dengan mengubah lokal sistem Windows sebelum instalasi. lebih...

Pengaturan dan Mengubah Collation Server - SQL Server 2008

  • Pastikan Anda memiliki semua informasi atau skrip yang diperlukan untuk membuat kembali basis data pengguna Anda dan semua objek di dalamnya.

  • Ekspor semua data Anda menggunakan alat seperti bcp Utility. Untuk informasi lebih lanjut, lihat Mengimpor dan Mengekspor Data Massal.

  • Jatuhkan semua basis data pengguna.

  • Bangun kembali database master yang menetapkan collation baru di properti SQLCOLLATION dari perintah setup

  • Buat semua database dan semua objek di dalamnya.

  • Impor semua data Anda.

Mengatur dan Mengubah Database Collation - SQL Server 2008

  • Atur COLLATIONopsi dalam CREATE DATABASEpernyataan saat membuat database baru.
  • Demikian pula, atur COLLATIONopsi dalam ALTER DATABASEpernyataan untuk mengubah susunan basis data yang ada.

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

Mengatur dan Mengubah Kolom Kolasi

  • Beberapa susunan kolom akan tetap sama bahkan setelah Anda mengubah susunan basis data. Dalam hal ini, Anda harus memodifikasi susunan kolom individual.
CoderHawk
sumber
6

Pastikan Anda benar-benar ingin "menjatuhkan" basis data pengguna seperti disebutkan dalam jawaban di atas. Anda mungkin hanya ingin "melepaskan" basis data. Atau sungguh, Anda tidak dapat melakukan apa pun karena membangun kembali master secara efektif menghapus tautan apa pun ke basis data pengguna. Ada kalanya database dibuat dalam susunan yang diinginkan tetapi server tidak. Anda tidak ingin harus memulihkan semua database pengguna Anda dari cadangan dalam kasus ini.

AndrewSQL
sumber
5

Saya melakukan sesuatu seperti ini dan itu berhasil tetapi Anda harus mengingat indeks yang menunjuk ke tipe data sebagai teks / varchar / nvarchar harus dihapus, jalankan skrip dan kemudian buat indeks.

USE YourDataBase
GO

DECLARE @Table_Name NVARCHAR(100)
SET @Table_Name = NULL--- THIS IS THE TableName that you want to change its collation columns

--- if null will set to all tables

DECLARE @TempTable AS TABLE
(
ID INT IDENTITY
,TableName NVARCHAR(100)
,ColumnName NVARCHAR(100)
,TypeName NVARCHAR(100)
,Max_length INT
,Collation_Name NVARCHAR(100)
,EnterDtm DATETIME DEFAULT GETDATE()
)
DECLARE @NewCollation NVARCHAR(100)
SET @NewCollation = 'Latin1_General_CI_AS' --- THIS IS THE COLLATION NAME THAT YOU WANT TO CHANGE

INSERT INTO @TempTable(TableName,ColumnName,TypeName,Max_length,Collation_Name)
SELECT 
QUOTENAME(SCHEMA_NAME(tables.schema_id)) + '.' + QUOTENAME(tables.name) AS TableName
,all_columns.name AS ColumnName
,type_name(all_columns.user_type_id)
,all_columns.max_length
,all_columns.collation_name  
from sys.all_columns INNER JOIN sys.tables ON
tables.object_id = all_columns.object_id
AND collation_name IS NOT NULL
AND all_columns.collation_name != @NewCollation
WHERE tables.object_id = ISNULL(object_id(@Table_Name),all_columns.object_id)


DECLARE @TableID SMALLINT
SET @TableID = (SELECT MIN(ID) FROM @TempTable)

DECLARE @Query NVARCHAR(1000),@TableName NVARCHAR(100),@ColumnName NVARCHAR(100),@TypeName NVARCHAR(100)
,@Size INT

WHILE @TableID IS NOT NULL
BEGIN
    SET @TableName = (SELECT TableName FROM @TempTable WHERE ID = @TableID)
    SET @ColumnName = (SELECT QUOTENAME(ColumnName) FROM @TempTable WHERE ID = @TableID)
    SET @TypeName = (SELECT TypeName FROM @TempTable WHERE ID = @TableID)
    SET @Size = (SELECT Max_length FROM @TempTable WHERE ID = @TableID) 

    SET @Query='ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @TypeName+ ISNULL ('(' +CAST(@Size AS VARCHAR(200))+')', '') +' COLLATE '+ @NewCollation  
    PRINT (@Query)

    SET @TableID = (SELECT MIN(ID) FROM @TempTable WHERE ID > @TableID)
END 

ini jawaban pertamaku diposting maafkan kekacauan saya

Jeffry
sumber
-1

Mengekspor semua data (termasuk login, server yang ditautkan, pekerjaan SQL Agent, pengaturan DB Mail, dll), dan membangun kembali data tingkat instance, ditambah memuat kembali semua data pengguna, adalah banyak pekerjaan. Dan, bahkan setelah semua itu, masih belum ada jaminan bahwa Anda dapat memperbarui collation default database viaALTER DATABASE susunan karena ada beberapa kondisi yang akan mencegah operasi dari menyelesaikan (lihat bagian "Mengubah Susunan Basis Data" dari ALTER DATABASEdokumentasi untuk perincian) .

Namun, ada metode tidak berdokumen yaitu jauh lebih mudah. Kelemahan utama adalah bahwa itu tidak didukung. Ini bukan untuk mengatakan bahwa ada sesuatu yang salah, hanya saja jika sesuatu terjadi, Microsoft tidak akan membantu memperbaikinya (karena mereka tidak pernah menjamin bahwa itu akan berhasil).

Metode yang saya bicarakan berjalan sqlservr.exedengan-q {new_collation_name} sakelar. Ada sedikit lebih dari itu, tetapi itu adalah ide dasar. Metode ini hanya memperbarui meta-data sistem, yang memiliki manfaat dan konsekuensi, yang utama adalah:

MANFAAT

  • cukup cepat
  • Bypass sebagian besar pembatasan yang mencegah ALTER DATABASE bekerja
  • kemungkinan jauh lebih akurat daripada skrip apa pun yang orang buat selama bertahun-tahun untuk menjatuhkan dan membuat ulang objek

DRAWBACKS

  • tidak didukung jika terjadi kesalahan
  • VARCHARdata dapat berubah, JIKA halaman kode berbeda antara susunan lama dan baru, dan karakter dengan nilai 128 - 255 (0x80 - 0xFF) ada, dan karakter tersebut tidak ada sebagai karakter yang sama dengan nilai yang sama pada kode baru halaman. Jadi ada potensi untuk kehilangan data, dan data Anda perlu diteliti terlebih dahulu untuk memastikan bahwa kondisi ini tidak ada. Tetapi, ini juga berarti bahwa ada banyak kasus dengan kasus saja karakter yang memiliki nilai 0 - 127 yang tidak dalam bahaya, bahkan jika halaman kode berubah.
  • Jenis Tabel yang Ditentukan Pengguna (UDTT) dilewati dan perlu diperbarui secara manual.

Untuk uraian terperinci tentang apa yang sqlservr.exe -qdilakukan dan tidak dilakukan metode (termasuk perincian tentang cara kerja pemeriksaan di berbagai tingkat, dan masalah potensial yang harus diwaspadai), silakan lihat posting saya:

Mengubah Susunan Instans, Basis Data, dan Semua Kolom di Semua Basis Data Pengguna: Apa yang Mungkin Salah?

Untuk mengubah hanya contoh (termasuk sistem database: master, model, msdb, dan tempdb) dan satu atau lebih database (tapi tidak semua database), hanya melepaskan database (s) yang ingin Anda kecualikan dari operasi ini, dan kemudian pasang kembali mereka setelah pembaruan pemeriksaan selesai.

Solomon Rutzky
sumber