2017-01-18 8 views
0

SQL REVOKEコマンドのパラメータを設定するにはどうすればよいですか?SQL REVOKEコマンドをパラメータ化する方法

DECLARE @ViewName nvarchar = 'MyViewName' 
DECLARE @UserRole nvarchar = 'MyRoleName' 

REVOKE SELECT ON [@ViewName] TO [@UserRole] 

出力次のエラー:

Cannot find the object '@ViewName', because it does not exist or you do not have permission.` 

が、私はこれを解決するために、動的SQLを使用する必要があるか、別の方法はありますか?

私の実際の使用事例は、ASP.NET SqlDataClientにあり、コードが生成されているので、私はそれを制御できません。 SQL(SQLプロファイラによって盗聴)に送信されるコードは次のとおりです。

exec sp_executesql N'REVOKE SELECT ON [@ViewName] TO [@UserRole]',N'@ViewName nvarchar(24),@UserRole nvarchar(12)',@ViewName=N'MyViewName',@UserRole=N'MyUserRole' 
+0

動的SQLを使用する必要があります。 –

+0

'GRANT'と' REVOKE'はかなりの権限を必要とするので、動的SQLを構築し、別の資格情報でコマンドを実行できるストアドプロシージャでこれを行うのが魅力的です。そうすることで、ストアドプロシージャへのアクセスを制御し、監査が必要になった場合に監査を追加し、最後にパラメータを使用し続けることができるようにすることで、REVOKEに権限を選択的に割り当てることができます。 –

+0

正解のように聞こえる@JeroenMostertあなたが答えとしてそれを入れ、小さな例を追加するならば、私は正しい印をつけます。 – Adam

答えて

1

GRANTREVOKEがかなりの権限そのものを必要とするので、それは、動的SQLを構築するストアドプロシージャでこれを行うには、通常は魅力的だし、コマンドを実行することができます別の資格でそうすれば、ストアドプロシージャへのアクセスを制御して、REVOKEに権限を選択的に割り当てることができます。これが必須となった場合に監査を追加し、最後にパラメータを使用し続けることができます。この場合

EXECUTE AS OWNER

CREATE PROCEDURE dbo.RevokeSelect(@ObjectName NVARCHAR(128), @RoleName NVARCHAR(128)) 
WITH EXECUTE AS OWNER AS BEGIN 
    SET NOCOUNT ON; 

    DECLARE @SQL NVARCHAR(MAX); 
    SELECT @SQL = REPLACE(REPLACE(
     N'REVOKE SELECT ON @ObjectName TO @RoleName;', 
     '@ObjectName', QUOTENAME(@ObjectName)), 
     '@RoleName', QUOTENAME(@RoleName)) 
    ; 
    -- For debugging 
    --PRINT @SQL 
    EXEC (@SQL) 
END; 
GO 
GRANT EXECUTE ON dbo.RevokeSelect TO [application_login]; 

おかげで、[application_login]アカウントが必要なし追加の権限。ストアドプロシージャを使用してデータベース内の任意のオブジェクトに対してREVOKE SELECTを実行できます。これはまさにあなたが望むものですが、そうでない場合は、EXECUTE AS OWNERを削除し、個々のオブジェクトにCONTROLのアクセス権を与える必要があります(ただし、もちろん、他にも多くの操作が可能です)。

動的SQLを実行するプロシージャでは、動的SQLを使用するものと同様に、SQLインジェクションの影響を受けないように注意深く検討する必要があることに注意してください。明らかに、プロシージャがEXECUTE AS OWNERを使用する場合は、何かを行うことができるので、これはさらに重要です。この場合、両方のパラメータにQUOTENAMEを適用すると、それが処理されます。

最後に、EXECUTE AS OWNERはシンプルで便利ですが、データベース所有者がアカウントではなくグループであれば失敗します。この場合、アクセス許可を委任する場合は、EXECUTE ASで使用するプロキシアカウントを作成するか、証明書を使用してストアドプロシージャに署名する必要があります。開発者がEXECUTE AS OWNERの権限で信頼できない場合は、とにかくこれを行うことができます。それはこの答えの範囲を超えていますが、Erland Sommerskogにはこのトピックに関するexcellent writeupがあります。

+0

あなたのコメントを完全な答えに展開するために時間をかけていただきありがとうございます。優れた! – Adam

+0

は 'SELECT'をパラメータ化することもできますか?すなわち、@RevOKE @Permission ON @ObjectName to @ RoleName'となる。これをやろうとすると、 'SELECT' *の近くで誤った構文が返されます。私は以下のSQLを生成するSqlDataSourceから実行しようとしています(SQLプロファイラによって取得されます): 'exec revokeRolePermission @ Permission = N'SELECT '、@ RoleName = N'MyRoleName'、@ ObjectName = N'MyViewName'' – Adam

+0

@ Adam:他の2つのパラメータと同様にテキスト置換を使用できます。別の 'REPLACE('。これを行うと、 'REVOKE BANANA'のような無意味な呼び出しも可能になることに注意してください;もしこれが問題であれば、ストアドプロシージャが引数をチェックするだけでよいかもしれません(' IF @Permission = 'SELECT' THEN ... ')。 –

関連する問題