🐡

Azure SQL Database Managed Instance での包括データベース作成手順

2022/03/18に公開

包括データベースについては以下のドキュメントを参照してください。
https://docs.microsoft.com/ja-jp/sql/relational-databases/databases/contained-databases

Azure SQL Database Managed Instnace (以下 SQL MI) で包括データベースを作成する際には、以下の手順で作成する必要があります。

  1. CREATE DATABASE ステートメントで非包括データベースを作成
  2. ALTER DATABASE ステートメントで包括データベースに変更

SQL MI の CREATE DATABASE ステートメントでは CONTAINMENT オプションがサポートされていないため、このような手順を取る必要があります。
https://docs.microsoft.com/ja-jp/azure/azure-sql/managed-instance/transact-sql-tsql-differences-sql-server#create-database-statement

具体的な SQL ステートメントは以下になります。

CREATE DATABASE <データベース名> COLLATE <照合順序>
GO
ALTER DATABASE <データベース名> SET CONTAINMENT = PARTIAL
GO

なお、ALTER DATABASE ステートメント実行時に

ALTER DATABASE failed because a lock could not be placed on database

というエラーがでることがあります。包括データベースに変更する時には排他ロックを取得する必要があるのですが、他のアクティブなプロセスがデータベースのロックを保持しているときに、このエラーが発生します。ロックが解放されるのを待って ALTER DATABASE ステートメントを再実行してください。ロックの有無を確認するには、以下のクエリが使用できます。

SELECT
    resource_type, resource_database_id, request_mode, request_type, request_status, request_session_id 
FROM 
    sys.dm_tran_locks
WHERE
    resource_database_id = DB_ID('<データベース名>')

Discussion