データベースには、別のデータベースに格納されているデータマートからデータをロードするために使用されるストアド プロシージャがいくつかあります。これらの手順は、通常、次の形式です。
CREATE PROCEDURE load_stuff
WITH EXECUTE AS OWNER AS
INSERT INTO my_db.dbo.report_table
(
column_a
)
SELECT
column_b
FROM data_mart.dbo.source_table
WHERE
foo = 'bar';
これらは、SQL Server Management Studio でクエリを実行すると正常に実行されます。EXEC load_stuff を使用してそれらを実行しようとすると、手順はセキュリティ警告で失敗します。
サーバー プリンシパル "the_user" は、現在のセキュリティ コンテキストではデータベース "data_mart" にアクセスできません。
sproc の OWNER は dbo で、これは the_user です (この例のために)。両方のデータベースの OWNER も the_user であり、the_user は dbo にマップされます (これは SQL Server が行うべきことです)。
SQL Server でこのエラーが表示されるのはなぜですか? これは、問題のユーザーが dbo としてエイリアス化されており、クロスデータベース データ アクセスに別のユーザー アカウントを使用する必要があるためですか?
編集 これは、SQL Server がクロス データベース所有権チェーンをデフォルトで無効にしているためであると理解しています。これは良いことです。ただし、この状況でのベストプラクティスはわかりません。このシナリオのベスト プラクティスについて意見をお持ちの方がいらっしゃいましたら、よろしくお願いいたします。
編集 2 最終的な解決策は、両方のデータベースで TRUSTWORTHY ON を設定することでした。これにより、完全なデータベース所有権の連鎖に頼ることなく、2 つのデータベース間の限定的な所有権の連鎖が可能になります。