SQL 'Execute As' ログイン コマンドと Linq to SQL
-
19-09-2019 - |
質問
「Execute As」コマンドを使用して、別のログインとして SQL クエリを実行しようとしています。私は Linq to SQL を使用しているので、データ コンテキスト クラスを生成し、ExecuteQuery メソッドを使用して 'Execute As' SQL コマンドを実行しています。次に、Linq to SQL コマンドを呼び出します。これは成功します。ただし、後続のクエリはすべて次のエラーで失敗します。
現在のコマンドで重大なエラーが発生しました。結果があれば、破棄する必要があります。
私が試したコードスニペットは次のとおりです。
SummaryDataContext summary = new SummaryDataContext();
summary.ExecuteQuery<CustomPostResult>(@"Execute as Login='Titan\Administrator'");
var test = summary.Customers.First();
var test2 = summary.Products.ToList();
2 番目のクエリでどのクエリを実行しても、上記のエラー メッセージが表示されます。助けていただければ幸いです。
解決
私は、ADO.NETクラスを使用してクエリを実行することにより、自分のアプリケーションでこの問題を回避するために管理します。
SqlCommand cmd = new SqlCommand("EXECUTE AS USER = 'operator'");
cmd.Connection = dc.Connection as SqlConnection;
cmd.Connection.Open();
cmd.ExecuteNonQuery();
// do the rest of the queries using linq to sql
他のヒント
これはすでに除外されているかもしれませんが、考えられる回避策の 1 つは、単に別の接続文字列を使用してデータ コンテキストを作成することです。
接続文字列を編集するには、DataContext.Connection.ConnectionString プロパティを設定します。以前、データ コンテキストの作成時に呼び出される部分メソッド OnCreated() でこれを実行しました。私はテストしていませんが、次のこともできると思います。
YourDataContext dc = new YourDataContext();
dc.Connection.ConnectionString = "connection string here";
これについても説明した記事があります - http://www.mha.dk/post/Setting-DataContext-Connection-String-at-runtime.aspx
私は同様の問題を抱えていたとruskeyの答えを見て、私はユーザーとして実行することができましたが、その後、他のクエリを実行しているとき、私はエラーを得ていたことに気づきました。これは、不足して戻すことによるものでした。だから、同様の問題を持つ人のために、このコードがどのように見えるかです。
SqlCommand cmd = new SqlCommand("EXECUTE AS USER = 'domain\\user';");
OSSDBDataContext dc = new OSSDBDataContext();
cmd.Connection = dc.Connection as SqlConnection;
cmd.Connection.Open();
cmd.ExecuteNonQuery();
//Execute stored procedure code goes here
SqlCommand cmd2 = new SqlCommand("REVERT;");
cmd2.Connection = dc.Connection as SqlConnection;
cmd2.ExecuteNonQuery();