2つのデータベースDB_AとDB_Bがあります。開発者はDB_Aから、DB_Bのtable_aを切り捨てるストアドプロシージャを呼び出しています。アプリケーションからのログインを使用してストアドプロシージャを実行すると、これは「app_user」と呼ばれ、エラーメッセージが返されます。オブジェクト ""は存在しないか、権限がないため、見つかりません。
ここでの最初の本能は、DB_AとDB_Bの両方でapp_userの権限を確認することです。ユーザーは後者のdb_ownerです。私は、sp_change_users_loginを実行して、データベースユーザーが孤立しているかどうかを確認しました。なぜこのエラーがまだ発生するのか、正確にはわかりません。任意の助けをいただければ幸いです。
ここでのこの問題は、デフォルトではデータベースレベルの権限がデータベース間で転送されないため、DB_B
のユーザーが何であるかはそれほど重要ではないということです。これを機能させる方法はほとんどありませんが、大きなセキュリティリスクもあります。データベース間の所有権の連鎖を有効にしたり、TRUSTWORTHY
データベースプロパティを有効にしたりします。しかし、どちらも必要ありません。代わりに、あなたができることは:
DB_A
で証明書を作成するDB_A
のストアドプロシージャに署名するDB_B
に同じ証明書を作成しますDB_B
にユーザーを作成しますDB_B
の証明書ベースのユーザーをdb_owner
データベースロールに追加します。2つのデータベース間でこれが機能していることを示す関連質問については、次の私の回答を参照してください。
この回答をありがとうございます。しかし、答えへの道のりははるかに簡単でした。何がエラーだったのかと言っても恥ずかしいですが、これが他の誰かの助けになるなら、それだけの価値があります。どうやら、プロシージャはEXECUTE AS USER = app_userステートメントで呼び出されていたようです。前述のように、「データベースユーザーの権限」は譲渡できません。 EXECUTE AS LOGINとして実行すると、機能しました。ログインとしてssmsにログインして実行した場合も同様に機能します。皆様のご回答ありがとうございます