0

過度のブロッキングを監視するために、いくつかの基本的な SQL Server 監視を実装しています。

次のようなストアド プロシージャがあります。

CREATE PROCEDURE [dbo].[bsp_GetBlockedProcessCount]
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @count INT

    SELECT @count = COUNT(*)
    FROM master.dbo.sysprocesses WITH (NOLOCK)
    WHERE blocked > 0

    RETURN @count
END

これを管理者コンテキストで実行すると、正しい答えが得られます。権限が制限されたユーザー (つまり、Web サーバー) のコンテキストでこれを実行すると、真の答えに関係なくゼロになります。

私はいくつかの解決策を考えることができますが、私はそれらのどれにも満足していません:

  1. ユーザーに VIEW SERVER STATE 権限を付与できますが、それはこのユーザーが持つべきよりも多くの権限です。

    GRANT VIEW SERVER STATE TO [Webserver]
    
  2. SQL ジョブから proc を実行し、Web サーバーが取得できるように結果をどこかに配置しますが、これは面倒で複雑です。

  3. これを Web サーバーから呼び出そうとしないでください。

より良い解決策があると確信しています。助言がありますか?

4

1 に答える 1

0

答えが直接わからなくてよかったです:)しかし、EXECUTE ASとREVERTを使ってユーザーを切り替えました

しかし、ここに2つの良いリンクがあります

REVERT 句を使用した SQL Server でのストアド プロシージャ実行コンテキストの切り替え

要約:DBAと言うようにユーザーにIMPERSONATEを付与し、その後元に戻します

http://www.mssqltips.com/tip.asp?tip=1579

ストアド プロシージャによるアクセス許可の付与

要約:私は怠惰すぎてすべてを読むことができません

http://www.sommarskog.se/grantperm.html

于 2008-12-09T20:21:50.190 に答える