web-dev-qa-db-ja.com

オブジェクトが存在しないため、見つかりません

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を実行して、データベースユーザーが孤立しているかどうかを確認しました。なぜこのエラーがまだ発生するのか、正確にはわかりません。任意の助けをいただければ幸いです。

2
mqbk

ここでのこの問題は、デフォルトではデータベースレベルの権限がデータベース間で転送されないため、DB_Bのユーザーが何であるかはそれほど重要ではないということです。これを機能させる方法はほとんどありませんが、大きなセキュリティリスクもあります。データベース間の所有権の連鎖を有効にしたり、TRUSTWORTHYデータベースプロパティを有効にしたりします。しかし、どちらも必要ありません。代わりに、あなたができることは:

  1. DB_Aで証明書を作成する
  2. その証明書でDB_Aのストアドプロシージャに署名する
  3. 組み込み関数を使用して証明書バイトと秘密鍵バイトを抽出します: [〜#〜] certencoded [〜#〜][〜#〜] certprivatekey [〜#〜]
  4. 抽出した証明書と秘密鍵のバイトを使用して、DB_Bに同じ証明書を作成します
  5. その証明書からDB_Bにユーザーを作成します
  6. DB_Bの証明書ベースのユーザーをdb_ownerデータベースロールに追加します。

2つのデータベース間でこれが機能していることを示す関連質問については、次の私の回答を参照してください。

SQL Serverのストアドプロシージャに特別なアクセス許可を与える

1
Solomon Rutzky

この回答をありがとうございます。しかし、答えへの道のりははるかに簡単でした。何がエラーだったのかと言っても恥ずかしいですが、これが他の誰かの助けになるなら、それだけの価値があります。どうやら、プロシージャはEXECUTE AS USER = app_userステートメントで呼び出されていたようです。前述のように、「データベースユーザーの権限」は譲渡できません。 EXECUTE AS LOGINとして実行すると、機能しました。ログインとしてssmsにログインして実行した場合も同様に機能します。皆様のご回答ありがとうございます

0
mqbk