修改MSSQL Instance定序

日前發現一個資料庫定序跟其他資料庫不同,為求一致性,我們可以單純用Alter Database去改資料庫的定序。但這樣的改法並不會修正該資料庫中其他資料表欄位原有的定序,只會影響未來新增的資料表。所以如果舊資料表欄位也要更改定序的話會需要Alter Table Alter Column 或 建立新資料表並重倒資料。

然而如果我們直接更改SQL Instance定序的話,則整個過程中也會同時修改所有Table的Column的定序,以下是個小小的展示LAB。


下圖中我們可以看見這台SQL Instance的定序是SQL_Latin1_General_CP1_CI_AS,其下面的所有系統資料庫定序也是SQL_Latin1_General_CP1_CI_AS

 

接下來我建立兩個資料庫為DB1及DB2,然後在DB1及DB2中再建立資料表tb1。

 

完成上述步驟後我們看一下DB1及DB2跟其下的tb1資料表name欄位的定序都是SQL_Latin1_General_CP1_CI_AS(如下圖所示)。

 

接下來我用Alter Database [DB1] Collate Chinese_Taiwan_Stroke_CI_AS語法來更改DB1資料庫定序,如下圖所示。

 

改完以後我們再來看一下DB1的定序及其tb1資料表name欄位的定序,由下圖圈選處可以看到資料庫層級的定序已經變成Chinese_Taiwan_Stroke_CI_AS了,但是tb1資料表name欄位的定序還是SQL_Latin1_General_CP1_CI_AS,並無一併更改。

 

接下來我異動整個Instance的定序,看看會有甚麼不同變化。
指令為 :

sqlservr -m -T4022 -T3659 -s"mssqlserver" -q"Chinese_Taiwan_Stroke_CI_AS"
[-m] single user admin mode
[-T] trace flag turned on at startup
[-q] new collation to be applied

TF4022 is to bypass startup procs.
TF3659 on the other hand is supposed to write errors to the error log

下完指令後我們可以透過訊息得知SQL修改完成了。

 

上述完成後我們再檢視一下DB1及DB2跟其底下的tb1資料表name欄位定序,如下圖所示都轉成Chinese_Taiwan_Stroke_CI_AS了。

上述簡易實驗只是在展示SQL Instance在異動定序時也會一併修改資料表欄位定序,但這種修改不是只單單修改Meta Data而已。也會根據新的定序規則重新排列資料,因此這種方式並不是沒有Cost的歐。

我是ROCK

rockchang@mails.fju.edu.tw