3

データベースには、別のデータベースに格納されているデータマートからデータをロードするために使用されるストアド プロシージャがいくつかあります。これらの手順は、通常、次の形式です。


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 つのデータベース間の限定的な所有権の連鎖が可能になります。

4

3 に答える 3

2

EXECUTE AS OWNER を削除しないのはなぜですか?

通常、SP を実行しているユーザーは、両方のデータベースで適切な権限を持っているため、その必要はまったくありません。

于 2008-09-29T18:18:34.197 に答える
1

ログインを作成する必要はありません。ターゲット DB でゲスト ユーザーを有効にするだけです。

ゲストへの接続を許可する

これにより、実行ユーザーはゲスト コンテキストで DB に入ることができ、「db チェーンがオンの場合、アクセスはターゲット DB でチェックされません。

于 2011-02-18T15:31:13.230 に答える
0

実際、DBO はロール (ユーザーのグループと見なすことができます) であり、ユーザー自体ではありません。(dbo:passwordfordbo を使用して SQL SERVER に接続できない限り、それはユーザーではありません)。

通常、SQL Server の素晴らしい世界では、userX に storedprocY を実行する権限を付与すると、X は、Y で使用されるすべてのオブジェクトに対するすべての権限を持っていなくても、Y に含まれるすべてのタスクを実行する権限を取得します。

これは、ビジネス ロジックをストアド プロシージャにカプセル化するのに非常に便利な機能です。(ユーザーはテーブルにアクセスできませんが、1 つのストアド プロシージャを実行できます)。

「所有権の連鎖」について話すとき、それは次のことを意味します (私が間違っている場合は訂正してください) - 所有権の連鎖が無効になっている場合: 必要なすべてのオブジェクトが同じデータベースにある限り、procedureX を実行する権利は機能します - のチェーンが有効になっている: その「特権」はすべてのデータベースに拡張されます。

それが役立つことを願って、

于 2008-10-01T14:51:58.530 に答える