2

client.UpdateClientSQLユーザーによって実行されるsproc(それを呼び出す)があります(それを呼び出すMyWCFServicesUser.

MyWCFServicesUserデータベースに対するデータ読み取り権限とデータ書き込み権限があります。また、sproc に対する実行権限も持っています (ただし、他の権限はありません)。

sproc は with に行を挿入client.ClientSET IDENITY_INSERT client.Client ONます。

この sproc (SSMS から) を統合セキュリティ (I am sa) で実行すると、すべて正常に動作します。

MyWCFServicesUser(SSMSから)として実行すると、次のエラーで失敗します:

メッセージ 1088、レベル 16、状態 11、プロシージャ UpdateClient、行 33
オブジェクト「client.Client」が存在しないか権限がないため、見つかりません。

私は通常、すべての sproc とテーブルをデフォルト (dbo) スキーマに持っていますが、今回は dbo を使用しないようにしています。

それが私に権限がない理由ですか?何らかの方法でsprocを昇格させる必要がありますか? それともユーザー?またはどういうわけかスキーマを変更しますか?

私は困惑しています...

4

3 に答える 3

3

ストア プロシージャで特権要件を解決する適切な方法は、コード署名を使用することです。このようにして、必要な特権 (つまりALTER TABLE) をユーザーではなくプロシージャーに付与し、プロシージャー (またはスキーマ) の EXECUTE をユーザーに付与するだけで済みます。利点は、権限の低いユーザーがプロシージャを呼び出すことしかできず、プロシージャによって制御されるように、昇格された権限が必要なアクション (つまり、identity_insert をオンに設定) を実行できることです。必要な権限をユーザーに直接付与した場合、ユーザーはその権限で許可されている操作 (列の追加、制約の削除など) にそれを使用できます。リンクにはいくつかの例があります。

そうは言っても、あなたの質問はSET IDENTITY_INSERT、1 回限りのデータ読み込みに通常使用される特別な設定である に関するものであることを強調しておく必要があります。日常的な CRUDUpdateClient手順のように見えるものからこれを設定しているという事実は、少しコードの匂いがします。

于 2012-02-24T00:51:00.873 に答える
0

重要なのは、あなたが言及したオブジェクトの所有者が誰であるかです。それらが異なるユーザーによって作成された可能性はありますか? おそらく、sa がテーブルの所有者で、MyWCFServicesUser が proc を所有していますか?

所有権チェーンに関するこのリンクを参照してください http://msdn.microsoft.com/en-us/library/ms188676.aspx調査に役立つ場合があります

于 2012-02-23T20:26:57.677 に答える