Veritabanı ve mevcut tablolarının, kolonlarının collation’ınını değiştirmek

2 Eyl by NURULLAH ÇAKIR

Veritabanı ve mevcut tablolarının, kolonlarının collation’ınını değiştirmek

Bazı durumlarda veritabanı collation değişikliği gerekebilir. Birçok kişi veritabanı seviyesinde collation’ı değiştirmenin durumu düzelteceğini düşünür. Fakat veritabanı bazında collation’ı değiştirdiğinizde mevcut tablolardaki kolonların collation’ı değişmez. Bu makalede bu sorunu nasıl çözeceğimizi bulabilirsiniz.

 

Öncelikle verinizin güvenliği için backup almayı ihmal etmeyin.

 

Aşağıdaki kod yardımıyla veritabanı bazında collation’ ı değiştirebilirsiniz.

USE master
GO
SELECT DATABASEPROPERTYEX('test','COLLATION')
GO
ALTER DATABASE test SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE test 
GO    
ALTER DATABASE test COLLATE Turkish_CI_AI
GO
SELECT DATABASEPROPERTYEX('test','COLLATION')
GO

ALTER DATABASE test SET MULTI_USER

 

Fakat veritabanı collation değişikliği mevcut tablolar ve kolonlar için geçerli değildir. Eğer mevcut tablolar ve tüm kolonlar için de aynı değişikliği yapmak isterseniz yukarıdaki script’i çalıştırdıktan sonra aşağıdaki script’i çalıştırmalısınız.

declare @NewCollation sysname
set @NewCollation = 'Turkish_CI_AS'
select
    'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(stable.schema_id)) + '.' + QUOTENAME(stable.name) +
    ' ALTER COLUMN ' + QUOTENAME(scol.name) + ' ' + stype.name + '(' +
    CASE WHEN scol.max_length = -1 THEN 'max' ELSE CONVERT(varchar(10),scol.max_length) END +
    ') collate ' + @NewCollation + '
    go
    '
from sys.columns scol inner join sys.tables stable    on scol.object_id = stable.object_id
        inner join sys.types stype on scol.user_type_id = stype.user_type_id

where  scol.collation_name is not null and OBJECTPROPERTY(stable.object_id,N'IsMSShipped')=0

 

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir