Bir SQL Server Veritabanı harmanlamasını nasıl değiştirebilirim?


16

Latin1_General_CI_AS (standart harmanlama) tek bir harmanlama tüm veritabanlarını standardize etmeye çalışıyorum. SQL_Latin1_General_CP1_CI_AS içinde olan bazı veritabanları var.

Ben veritabanı harmanlama değiştirmek için ALTER DATABASE kullanabilirsiniz biliyorum, ama bu sadece yeni nesneleri etkiler. Anladığım kadarıyla mevcut sütunları değiştirmenin tek yolu, her tablodaki her sütunda ALTER COLUMN yapmaktır - ve bunu yapmak için tüm dizinleri bırakıp yeniden oluşturmanız gerekir.

Sanırım böyle bir şey olurdu:

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)

ve tüm veritabanındaki her varchar, char, text, nvarchar, nchar ve ntext sütunu için tekrarlayın. Bu muazzam bir SQL betiği olurdu .

Bunu yapmanın daha kolay bir yolu var mı, yoksa herkes bunu yapmak için bir SQL komut dosyası oluşturmayı otomatikleştirmenin bir yolunu önerebilir mi?

Yanıtlar:


9

MS KB 325335 , tüm db ve tüm sütunlar için bunun nasıl yapılacağı ile ilgili seçeneklere sahiptir.

Temelde:

  1. Komut dosyası veritabanı tabloları (yeni harmanlama ile)
  2. DTS / SSIS verileri (harmanlamayı izlerken)
  3. Kısıtlama ekle


2

Ne yazık ki bu SQL Server'da kolay bir iş değildir.

Mevcut veritabanı nesneleriniz (tablolar, saklı yordamlar, görünümler vb.) İçin Redgate'in SQL Compare'i gibi bir komut dosyası aracı kullanabilirsiniz. Lisansınız yoksa, ücretsiz deneme sürümünü kullanabilirsiniz. Doğru harmanlama ile yeni veritabanını oluşturduktan ve nesneleri komut dosyanızdan yeniden oluşturduktan sonra, verileri bir veritabanından diğerine aktarmak için SSIS'yi çalıştırabilirsiniz. Çok fazla veri varsa, T-SQL toplu ekleme kullanın.

Bu sunucuda gelecekteki veritabanları için doğru harmanlamayı kullanmak için sunucudaki varsayılan harmanlamayı değiştirebilirsiniz. Aşağıdaki MSDN makalesinde, ALTER DATABASE ve ALTER TABLE COLLATE deyimlerini kullanarak hangi değişiklikler açıklanmaktadır:

Veritabanı Harmanlamasını Ayarlama ve Değiştirme (SQL Server 2008 Çevrimiçi Kitapları)

Bir kullanıcı veritabanında oluşturulan yeni nesnelerin harmanlamasını, ALTER DATABASE deyiminin COLLATE yan tümcesini kullanarak değiştirebilirsiniz . Bu ifade, varolan herhangi bir kullanıcı tanımlı tablodaki sütunların harmanlamasını değiştirmez. Bunlar ALTER TABLE COLLATE deyimi kullanılarak değiştirilebilir .

Veritabanı harmanlamasını değiştirdiğinizde, aşağıdakileri değiştirirsiniz:

  • Veritabanı için varsayılan harmanlama. Bu yeni varsayılan harmanlama, daha sonra veritabanında oluşturulan tüm sütunlara, kullanıcı tanımlı veri türlerine, değişkenlere ve parametrelere uygulanır. Ayrıca, SQL ifadelerinde belirtilen nesne tanımlayıcılarını veritabanında tanımlanan nesnelere çözümlerken de kullanılır.
  • Sistem tablolarındaki char, varchar, text, nchar, nvarchar veya ntext sütunları yeni harmanlama olarak değiştirilir.
  • Saklı yordamlar ve kullanıcı tanımlı işlevler için varolan tüm char, varchar, text, nchar, nvarchar veya ntext parametreleri ve skaler dönüş değerleri yeni harmanlama olarak değiştirilir.
  • Karakter, varchar, metin, nchar, nvarchar veya ntext sistem veri türleri ve bu sistem veri türlerine dayanan tüm kullanıcı tanımlı veri türleri yeni varsayılan harmanlama olarak değiştirilir.

1

Genellikle bunu canlı bir sunucuya yapmanız önerilmez. En son baktığımda, bunu yapmak Microsoft tarafından resmi olarak desteklenmedi. Bunu pratikte yapmak için doğru harmanlama ile yeni bir örnek oluşturmanız ve veritabanını buna taşımanız gerekir.

DB'nin farklı bir varsayılan harmanlama içeren bir sunucuya geri yüklenmesi, tempdb yeni sunucunun harmanlamasına sahip olacağından her türlü eğlenceye neden olur, bu nedenle bu da önerilmez.



1

Infomation_Schema görünümlerini yeterince kolayca bir komut dosyası oluşturmak için kullanabilirsiniz, ancak bunun sorununuzu çözmenin en iyi yolu olduğundan emin değilim. Büyük bir db tüm dizinleri yeniden oluşturmak çok büyük bir zaman / günlük alanı vb sürebilir. Yeni bir örneğe göç (geri değil) ile gitmek istiyorum.

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.