SQL 'Execute As' 登录命令和 Linq to SQL
Posted
技术标签:
【中文标题】SQL \'Execute As\' 登录命令和 Linq to SQL【英文标题】:SQL 'Execute As' Login Command and Linq to SQLSQL 'Execute As' 登录命令和 Linq to SQL 【发布时间】:2009-12-14 16:54:30 【问题描述】:我正在尝试使用“执行为”命令作为另一个登录名执行 sql 查询。我正在使用 Linq to SQL,因此我生成了一个数据上下文类,并且我正在使用 ExecuteQuery 方法来运行“执行为”SQL 命令。然后我调用一个成功的 Linq to SQL 命令。但是,每个后续查询都会失败并出现以下错误:
当前命令发生严重错误。结果(如果有)应丢弃。
这是我尝试过的代码sn-p:
SummaryDataContext summary = new SummaryDataContext();
summary.ExecuteQuery<CustomPostResult>(@"Execute as Login='Titan\Administrator'");
var test = summary.Customers.First();
var test2 = summary.Products.ToList();
无论我在第二个查询上运行什么查询,我都会收到来自上面的错误消息。任何帮助,将不胜感激。
【问题讨论】:
【参考方案1】:通过使用 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
【讨论】:
【参考方案2】:您可能已经排除了这一点,但一种可能的解决方法是简单地使用不同的连接字符串创建数据上下文。
要编辑连接字符串,您可以设置 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
【讨论】:
一个不同的连接字符串...意味着您已经以纯文本形式存储了用户的密码,以便您可以使用它连接到数据库?【参考方案3】:我遇到了类似的问题,通过查看 ruskey 的答案,我能够以用户身份执行,但我注意到在那之后运行其他查询时出现错误。这是由于缺少Revert。所以对于任何有类似问题的人来说,这就是代码的样子。
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();
【讨论】:
以上是关于SQL 'Execute As' 登录命令和 Linq to SQL的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在“dbo 用户/管理员登录”权限下获得“WITH EXECUTE AS”(需要查看服务器状态)?
使用 EXECUTE AS 进行安全性时 SQL Server 的加速策略