Kobarin's Development Blog

C#やASP.NETなどについての記録です。

Azure SQL Database で、DBの照合順序の変更方法

Azureでは、SQL Databaseを新たに作成すると、照合順序がデフォルトとして「SQL_Latin1_General_CP1_CI_AS」になるため、
その後にTABLEにvarchar型などの文字列フィールドを作成すると、そのままだと全て「SQL_Latin1_General_CP1_CI_AS」になる(照合順序は、データベースと文字列フィールド別々に指定できる)。
例えば後から「Japanese_CI_AS」に変更する場合、フィールドに対して直接ALTERする事で対応するしかなくなる。
列の照合順序の設定または変更 - SQL Server | Microsoft Docs

ALTER TABLE dbo.MyTable 
ALTER COLUMN CharCol VARCHAR(50) COLLATE Japanese_CI_AI

フィールドの追加の度にこれでは流石に運用に難が生じるが、通常は「DBの照合順序は後から変更できない」とされる。
ただし、実は「データ層アプリケーションのインポート/エクスポート」を使う事で、”データベースの照合順序”の変更が可能である事がわかったので、ここから説明する。
情報源はこちら。
stackoverrun.com

方法を準に説明すると、以下の通り。ここではDB名は「MyDB」とする。

  1. SSMSでAzure のSQLに接続し、目的のDBを右クリックで「データ層アプリケーションのエクスポート」を実行(→MyDB.bacpac ファイルがダウンロードできる)
  2. MyDB.bacpacファイルのコピーを作成(例:MyDB.bacpac → MyDB2.bacpac)
  3. MyDB2.bacpac のファイル名を変更し、MyDB2.zip にする(実はbacpacとは、zipの拡張子を変えただけのファイル)
  4. 7-zip等を使ってzipを展開し、model.xml を開く(メモ帳でOK)
  5. 先頭の方に「Name="Collation" Value="SQL_Latin1_General_CP1_CI_AS"」となっている箇所があるので、Value部を「Japanese_CI_AS」に変更し、保存
  6. 次に、Origin.xml の Checksumの変更が必要なので、コマンドプロンプトで「CertUtil -hashfile "<model.xml の パス>" SHA256」を実行(参考: SQL AzureでエクスポートしたbacpacをローカルのSQLサーバーにインポートすると SQL72014が発生する - Qiita)し、得られたコードをOrigin.xml 内の「<Checksum Uri="/model.xml">ここに貼り付け</Checksum>」に貼り付ける。
  7. MyDB2内を再び圧縮し、MyDB2.zipが出来たら、MyDB2.bacpac にリネイム(注意:MyDB2を圧縮する際、7-zipでフォルダに対して圧縮すると、そのフォルダが余計に作成された形で圧縮されてしまい、後述するインポート時に「'Origin.xml' が dacpac パッケージにありません」とエラーが出てインポートできなくなるため、MyDB2フォルダ内のmodel.xmlを含む全ファイル&フォルダを選択して圧縮する)。
  8. SSMSに戻り、MyDBをいったん別のデータベース名に変更して退避させ(例:MyDB_backup)、「データベース」を右クリックし「データ層アプリケーションのインポート」を実行。
  9. 完了したら、MyDBのプロパティで照合順序が「Japanese_CI_AS」になっている事を確認して終了