私はこの質問にうまく対応できなかったので、問題を実証するためにこの可能な限り単純なテスト ケースを作成しました。
以下のコードでは、接続を使用する前に接続が使用できないことを検出できますか?
SqlConnection c = new SqlConnection(myConnString);
c.Open(); // creates pool
setAppRole(c); // OK
c.Close(); // returns connection to pool
c = new SqlConnection(myConnString); // gets connection from pool
c.Open(); // ok... but wait for it...
// ??? How to detect KABOOM before it happens?
setAppRole(c); // KABOOM
KABOOM は、Windows イベント ログにエラーとして現れます。
接続を開いたプリンシパルがその後新しいセキュリティ コンテキストを想定し、偽装されたセキュリティ コンテキストで接続をリセットしようとしたため、接続が切断されました。このシナリオはサポートされていません。Books Online の「偽装の概要」を参照してください。
...さらにコードの例外。
setAppRole は、接続にアプリケーション ロールを設定する簡単な方法です。これに似ている...
static void setAppRole(SqlConnection conn) {
using (IDbCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "exec sp_setapprole ";
cmd.CommandText += string.Format("@rolename='{0}'",myUser);
cmd.CommandText += string.Format(",@password='{0}'",myPassword);
cmd.ExecuteNonQuery();
}
}
実際のコードでは、接続を閉じる前にsp_unsetapproleを使用しようとしますが、常に保証されるとは限りません (継承されたバグのあるマルチスレッド アプリ)。いずれにせよ、kaboom を発生させる前にそれを検出できると期待するのは妥当と思われます。