![azblob://2022/11/11/eyecatch/2020-03-04-geo-replication-contained-database-user-000.jpg](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/2022/11/11/eyecatch/2020-03-04-geo-replication-contained-database-user-000.jpg)
こんにちは。cloud.config Divの神田です。
今回はGeoレプリケーションを構成したAzure SQL DatabaseにContained Database Userを作成します。
Contained Database Userとは
通常のSQL Databseのユーザは masterデータベースにログイン(パスワードなどの認証情報)を作成したあと、ログインと紐づける形で作成します。
そのためSQL Serverにアクセスする際の認証はmasterデータベースで行われます。
一方、 Contained Database User(包含データベースユーザ)はmasterデータベースにログインを作成せず、
ユーザ自体がパスワードを持つことにより、masterデータベースではなく、
ユーザデータベースで認証を行います。
参考 : master Database
https://docs.microsoft.com/ja-jp/sql/relational-databases/databases/master-database?view=sql-server-ver15
参考 : Contained Database Users - Making Your Database Portable
https://docs.microsoft.com/ja-jp/sql/relational-databases/security/contained-database-users-making-your-database-portable?view=sql-server-ver15
なぜ必要か?
Azure SQL DatabaseでGeoレプリケーションを構成した際、
プライマリとセカンダリでmasterデータベースは独立になりますが、
レプリケーション対象のユーザデータベースは登録されているユーザも含めて同期されてしまいます。
そのためmasterデータベースで認証を行う通常のユーザは
プライマリ、セカンダリでそれぞれ別個に必要になってしまいます。
これではフェールオーバーが発生した際に
ユーザ名とパスワードの不一致が発生してしまいます。
一方、Contained Database Userはmasterデータベースでの認証を行わず、
ユーザデータベースで認証を行うので、
プライマリ、セカンダリで認証情報も含めて同期されることにより、
確実に同じユーザ名、パスワードでアクセスすることが可能となります。
そのためGeoレプリケーションを構成したSQL Databaseでは一般的には
Contained Databse Userを使用します。
参考 : アクティブ geo レプリケーションの作成と使用 - 資格情報とファイアウォール規則の同期を保つ
https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-active-geo-replication#keeping-credentials-and-firewall-rules-in-sync
手順
1. Azure SQL Databaseでフェールオーバーグループを構成
2. プライマリSQL Serverに管理者でアクセス
3. Contaied Database Userを作成
4. セカンダリデータベースに作成したユーザでアクセスできることを確認
1. Azure SQL DatabaseでGeoレプリケーションを構成
事前にプライマリとなるSQL ServerとSQL Database、
セカンダリとなるSQL Serverを作っておきます。
AzureポータルでプライマリのSQL Serverから「フェールオーバーグループ」を選択し、
セカンダリとなるSQL Serverを選択しフェールオーバーグループを構成します。
これでGeoレプリケーションが構成されました。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/beforemigration/2020-03-04-geo-replication-contained-database-user-001.png?fit=1024%2C498&ssl=1)
2. プライマリのSQL Serverに管理者でログイン
SQL Server Management Studio(SSMS)を用いて
プライマリのSQL Serverに管理者でログインします。
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/beforemigration/2020-03-04-geo-replication-contained-database-user-002.png?fit=1024%2C555&ssl=1)
3. Contaied Database Userを作成
レプリケーションを構成しているユーザデータベースに
Contaied Database Userを作成します。
今回は以下のクエリを用いて作成します。
CREATE USER 作成するユーザー名 WITH PASSWORD = '任意のパスワード';
GO
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/beforemigration/2020-03-04-geo-replication-contained-database-user-003-1.png?fit=1024%2C553&ssl=1)
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/beforemigration/2020-03-04-geo-replication-contained-database-user-004.png)
4. セカンダリデータベースに作成したユーザでログインできることを確認
セカンダリのSQL Serverに、先ほど作成したContaied Database Userでログインします。
なお、 Contaied Database Userはmasterデータベースでの認証を行わないので、
接続先のデータベースを指定する必要があります。
※オプション > 接続プロパティ > データベースへの接続 より指定
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/beforemigration/2020-03-04-geo-replication-contained-database-user-005.png?fit=1024%2C555&ssl=1)
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/beforemigration/2020-03-04-geo-replication-contained-database-user-006.png?fit=1024%2C555&ssl=1)
![](https://prtechblogfd-crhzb5g6hkhqafdm.z01.azurefd.net/drupalimages/beforemigration/2020-03-04-geo-replication-contained-database-user-007.png)
終わりに
プライマリ、セカンダの両方にContained Database Userを作成することができました。
実際はユーザへの権限の付与も行いますが、今回は作成のみといたします。
メモ程度の内容ですが、今後も構築、運用のノウハウを記事にしていきたいと思います。