我正在使用C#,NUnit和SQL Server 2008 r2 dev版数据库运行集成测试。设置我的夹具包括创建一个新数据库并加载测试数据,所以我需要dbo权限。
但是,我希望以较少的权限运行测试。我有另一个可以通过身份验证的AD帐户,我可以使用模拟运行一些T-SQL,如下所述:http://support.microsoft.com/?scid=306158,如下所示:
public static bool ExecuteFileAs(string fileName, string connectionString,
string user, string domain, string password)
{
using(new Impersonator(user, domain, password))
{
using(var connection = new SqlConnection(connectionString))
{
connection.Open();
return SqlFileExecuter.RunSql(connection, fileName);
}
}
}
当我点击此代码段内的断点并启动Profiler时,我看到另一个连接以我提交给它的用户名打开,因此模拟确实有效。 不幸的是,我无法在夹具设置结束时运行所有模拟测试,并在夹具拆卸时结束它。在设置结束时,我执行以下操作:
impersonator = new Impersonator("username", "DOMAIN", "pwd");
第一次单元测试开始后,我收到此错误,其中列出了此测试中使用的一个dll:System.IO.FileLoadException: Could not load file or assembly '...' or one of its dependencies. Access is denied.
我已经授予其他帐户对我所有二进制文件的完全访问权限,这对我没有帮助。
欢迎任何建议。
编辑:我的工作站仍在运行XP。
答案 0 :(得分:3)
一种可能的解决方案是不使用Windows身份验证,而是使用SQL用户。这只是连接字符串的更改。
此外,如果错误与IO权限相关,您可以在模拟用户之前尝试执行所有IO。使用http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.server.aspx而不是SqlFileExecuter
,您可以直接对SQL Server执行T-SQL块(与ADO.NET不同)。 SMO与您上面的方式略有不同......
var s = new Server(connectionString);
s.ConnectionContext.ExecuteNonQuery(@"CREATE DATABASE test; GO; Use test; ...");
答案 1 :(得分:2)
尝试在没有共享读取访问权限的情况下检查是否有其他内容锁定了相同的文件。 还启用绑定错误日志记录。在win7开始菜单中键入fusion并以管理员身份运行,以便设置不会变灰。然后设置“将日志绑定失败到磁盘”并指定日志文件的位置。如果您没有获得任何日志,请在注册表中检查HKLM \ Software \ Microsoft \ Fusion \ ForceLog = 1