2017-03-29 4 views
0

私は、ユーザーには表示されない(プライベート)ストアドプロシージャをT-SQLで作成しました。彼には実行権限がありません。SQL CLRの権利:CLRのストアドプロシージャを呼び出す

CREATE PROCEDURE [dbo].[GetEntries] 
AS 
BEGIN 
    SELECT * FROM sometable 
END 

次に、ユーザーに実行権限があるCLRストアドプロシージャを作成しました。このストアドプロシージャは私のプライベートプロシージャを呼び出します。

using (SqlConnection conn = new SqlConnection()) 
{ 
    conn.ConnectionString = "context connection=true"; 
    conn.Open(); 

    SqlCommand command = new SqlCommand("exec dbo.[GetEntries] ", conn); 
... 

パブリックCLRストアドプロシージャを呼び出すと、プライベートストアドプロシージャを呼び出す権限がないというエラーが発生しました。これは、私の接続文字列が "context connection = true"で、ストアドプロシージャがユーザコンテキスト(ユーザ接続)にあるためです。

プライベートストアドプロシージャを呼び出すパブリック(ユーザーに表示される)T-SQLストアドプロシージャを書き込むときに、このストアドプロシージャを実行できます。

CREATE PROCEDURE [dbo].TSQLPublicSP 
AS 
BEGIN 
    Exec dbo.[GetEntries] 
END 

だから私の質問は、私はそれがT-SQLストアドプロシージャからである接続のようなSQL-CLRストアドプロシージャで、接続文字列を設定する方法、です。私はSQL-CLR接続文字列にdatabasenameを設定したくありません。私は、データベース名を形成し得ることができればそれは私のためにOKになりSqlContext

SqlConnection("server=LOCALHOST;integrated security=yes;database=" & 
    SqlContext.???CurrentDatabase???) 

答えて

1

はい、Context Connection(またはCREATE PROCEDURE文のEXECUTE AS句で指定したユーザーの呼び出し側のセキュリティコンテキストでありますデフォルトはEXECUTE AS CALLERです)。 T-SQLストアドプロシージャは、関連オブジェクトのパーミッションを意味する所有権を利用している

  • 挙動はSQLCLRストアドプロシージャとT-SQLストアドプロシージャの間で異なっていることが理由であります実行されているコードと同じ所有者のものです。

  • SQLCLRストアドプロシージャは、所有権チェインを解除する(SQLCLRオブジェクト内でコードを事前コンパイルする方法がないため)動的SQLを効果的に提出しています。

あなたは特別な許可が必要な場合、その後、あなたは次のようにモジュールの署名を使用する必要があります。

  1. は、証明書または非対称キーからユーザーを作成
  2. このデータベースに証明書または非対称キーを作成します。
  3. 許可EXECUTE証明書ベースまたはキーベースのユーザーに対する「隠し」ストアドプロシージャのアクセス許可
  4. 非表示のストアドプロシージャに署名します(マットではありません)。表示可能なものがT-SQLまたはSQLCLRの場合)ADD SIGNATUREを使用します。あなたはこのSQLCLRストアドプロシージャのための方法を含むアセンブリを変更した場合
  5. 、あなたはADD SIGNATURE
を再適用する必要があります
関連する問題