EXECUTE AS 句でメタデータを含む SQL Server 移行ジョブを作成して実行する

概要

SQL Server 移行ジョブは、データベース ユーザーとサーバー ログイン データを移行しません。そのため、ユーザーが EXECUTE AS '[database_user_name]' 句で定義したオブジェクトを含むソースは、新しい Cloud SQL レプリカに移行されません。これは、そのユーザーがまだ存在しないためです。その結果、移行プロセス全体が失敗します。

次に例を示します。

CREATE OR ALTER PROCEDURE dbo.example
WITH EXECUTE AS 'some_user'
AS BEGIN
…
END

some_user ユーザーは移行できないため、このストアド プロシージャは移行されません。これは、ユーザーがターゲット データベースに存在しないためです。

移行元データベースで EXECUTE AS '[database_user_name]' 句を使用しているオブジェクトを特定するには、次のクエリを使用して、移行先データベースにそのオブジェクトのユーザーがあるかどうかを確認します。

SELECT s.name AS schema_name, o.name AS object_name, p.name AS user_name
FROM sys.sql_modules m  
INNER JOIN sys.objects o ON o.object_id = m.object_id
INNER JOIN sys.schemas s ON s.schema_id = o.schema_id
INNER JOIN sys.database_principals p ON p.principal_id = m.execute_as_principal_id

このようなメタデータを含むソースから移行ジョブを実行するには、移行ジョブを開始する前に、移行先の Cloud SQL インスタンスにユーザーを作成します。