11

アプリケーションの役割を持つデータベースがあります。ロール メンバーはすべて、Active Directory のグループに属しています。テーブルから選択する権限をロールに与える代わりに、呼び出す必要があるすべてのストアド プロシージャに対する実行権限をロールに与えました。

これは、動的 SQL を構築して sp_executesql を呼び出すストアド プロシージャの 1 つを除いて、正常に機能します。

動的 SQL は次のようになります。

SET @SQL = N'
SELECT * 
FROM dbo.uvView1 
INNER JOIN uvView2 ON uvView1.Id = uvView2.Id'

EXEC sp_executesql @SQL

このロールのユーザーは、ストアド プロシージャの呼び出しに失敗しています。次のようなエラーが発生しますが、これは予想されることです。

オブジェクト 'uvView1'、データベース 'Foobar'、スキーマ 'dbo' に対する SELECT 権限が拒否されました。

動的 SQL のすべてのビューにロール権限を付与せずに、ユーザーにこのプロシージャを正常に実行させる方法はありますか?

4

3 に答える 3

11

はい。

プロシージャに EXECUTE AS CALLER 句を追加してから、ストアド プロシージャに署名し、署名に必要なアクセス許可を付与します。これは 100% 安全、確実、防弾です。証明書による署名手順を参照してください。

于 2010-11-02T19:57:23.403 に答える
2

必要な権限を持つ別の ID へのなりすましを使用できますか?

SET @SQL = N'
EXECUTE AS USER = ''TrustedUser'';
SELECT * 
FROM dbo.uvView1 
INNER JOIN uvView2 ON uvView1.Id = uvView2.Id'

EXEC sp_executesql @SQL
于 2010-11-02T19:32:06.050 に答える
0

いいえ、動的 SQL を使用しないように変更する方法はありますか?

于 2010-11-02T19:28:59.840 に答える