- PR -

ADO.NETによるアプリケーションロールDB接続

1
投稿者投稿内容
Tog
ベテラン
会議室デビュー日: 2002/06/09
投稿数: 76
投稿日時: 2003-02-22 11:22
お世話になっています。

Windowsアプリケーションのデータベースへのアクセスにアプリケーションロールを使用して接続したいと思っています。

データベースに詳しくないこともあり四苦八苦しています。

VB6でのサンプルの説明では「コネクションを接続している間、ロールが有効になります」とあり、非接続型のADO.Netで利用するのは難しいのでしょうか?

下記のコードでアプリケーションロールを有効にすることはできるのですが、作成したストアドプロシージャを実行したところ、「ネットワークの一般エラーです。ネットワークドキュメントを確認してください。」とエラーが出てしまいます。
アプリケーションロールの権限はすべて有効にしています。

アプリケーションロールについてご存じであればアドバイスいただけないでしょうか。
よろしくお願いいたします。

ConnectionString = "data source=(local);initial catalog=DT;integrated security=SSPI;persist security info=False;"

コード:
        Dim com As SqlClient.SqlCommand = Connection.CreateCommand
        Try
            Connection.Open()
            com.CommandText = "EXEC sp_setapprole 'App', 'Pass'"
            com.CommandType = CommandType.Text
            com.ExecuteNonQuery()
        Catch e As Exception
            Throw e
        Finally
            Connection.Close()
        End Try

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-02-24 08:57
こんにちは。

>>com.CommandType = CommandType.Text

com.CommandType = CommandType.StoredProcedure


CommandType.Textは、SQL文ですよ
Tog
ベテラン
会議室デビュー日: 2002/06/09
投稿数: 76
投稿日時: 2003-02-24 12:04
Jittaさん。お返事ありがとうございます。

StoredProcedureを"EXEC"で実行するにはCommandType.Textでなければいけないようです。
.StoredProcudereだと「ストアドプロシージャがみつかりません」とエラーが表示されてしまいました。

しかし、SQLServerのアプリケーションロールでの接続は接続がプールされない。コネクションをOPENのままにする必要がある。とADO.NETでの使用はよい方法でないのかもしれません

データベース接続方法を再検討してみようと思います。
NothingButXMLInfoSet
大ベテラン
会議室デビュー日: 2002/07/16
投稿数: 116
投稿日時: 2003-02-24 12:24
ADO.NETの「非接続云々」とは関係ないと思います。sp_setapproleを実行した後、ストアドプロシージャを実行する前に、そのSqlConnectionをCloseしてしまっていませんか?接続を閉じてしまったら接続はできませんので。。。

当方では次のコードで正しくアプリケーションロールが適用されることを確認しました。

コード:
<%@Page Language="C#"%>
<html><body><form runat="server"><asp:DataGrid runat="server" id="G1" /><br/>
</form></body>
<script runat="server">
void Page_Load(object o, EventArgs e){
if (!IsPostBack){
System.Data.SqlClient.SqlConnection cn = 
 new System.Data.SqlClient.SqlConnection("Server=.;Database=Northwind;Integrated Security=SSPI");
System.Data.SqlClient.SqlCommand cmd = 
 new System.Data.SqlClient.SqlCommand("exec sp_setapprole 'AppRole', 'password'", cn);
cn.Open();
cmd.ExecuteNonQuery();
System.Data.DataSet ds = new System.Data.DataSet();
System.Data.SqlClient.SqlDataAdapter ad = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM Employees", cn);
ad.Fill(ds, "Employees");
cn.Close();
G1.DataSource=ds;
G1.DataMember="Employees";
G1.DataBind();
}
}
</script></html>

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-02-24 14:38
こんにちは。
引用:

NothingBut.NETFXさんの書き込み (2003-02-24 12:24) より:
sp_setapproleを実行した後、ストアドプロシージャを実行する前に、そのSqlConnectionをCloseしてしまっていませんか?


この言葉で思い出しました。別の環境ですが、SQLCommandの文字列を変更すると、接続が閉じてしまいます。同じことが起こっているとこが考えられます。

Togさんの最初のポストでのコードは、
Connection.Open()
com.CommandText = "EXEC sp_setapprole 'App', 'Pass'"

で、NothingBut.NETFXさんのコードは、
System.Data.SqlClient.SqlCommand cmd =
 new System.Data.SqlClient.SqlCommand("exec sp_setapprole 'AppRole', 'password'", cn);
cn.Open();

と、Openするタイミングが異なっていますよね。NothingBut.NETFXさんのようにしてみると、どうなりますか?
Tog
ベテラン
会議室デビュー日: 2002/06/09
投稿数: 76
投稿日時: 2003-02-24 17:23
NothingBut.NETFXさん。Jittaさん。
お返事ありがとうございます。

サンプルコードとても参考になりました。
アプリケーションロールについて勘違いをしていました。
接続を閉じてしまっていました。

引用:

sp_setapproleを呼び出してアプリケーションを有効にすれば、それをアクティブにした接続の間のみ、権限を持つ。アプリケーションロールはセッションベース(接続ベース)である。
一つのアプリケーションから複数のユーザーがDBにアクセスする場合のセキュリティ管理の単純化に役立つ。



複数の場所で使用される小規模なクライアントーサーバーアプリケーションを作成していたので、できるだけ簡易な方法でDBアクセスを管理したいと思っていました。
複数の接続を利用するには使い方が間違でした

引用:

この言葉で思い出しました。別の環境ですが、SQLCommandの文字列を変更すると、接続が閉じてしまいます。同じことが起こっているとこが考えられます。


このことは知りませんでした。ありがとうございます。
これから気を付けけるようにします。

1

スキルアップ/キャリアアップ(JOB@IT)