大多数人似乎都遇到了相反的问题,但解决方案是"授予对数据库的访问权限。"我想限制对数据库(LocalDB)的两个连接之一的访问。我担心答案是"创建数据库用户并使用它来连接。"这仅用于测试,我不想要配置用户。有没有办法通过连接字符串强制实现与LocalDB的只读连接?我对此表示怀疑,但我想我会问。这是我当前的连接字符串:
def Event.most_like
select("events.id, count(like_events.event_id) as likes_count").
joins(:like_events).
group('events.id').
order("likes_count DESC").
limit(4)
end
实现要复杂得多,但基本上使用<add name="readonlyConnection" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;Database=test;Trusted_Connection=True; MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
类,如果有帮助的话。
答案 0 :(得分:0)
简短回答:不。
更长的答案:
您可以找到连接字符串here的所有可用选项;简而言之,分配给连接的权限不是ConnectionString类的关注点;他们是数据库的关注点。
人们有tried to do this with Entity Framework而且它只会导致一系列黑客攻击,而不仅仅是创建一个darn用户。
这是你做的事情(在一个不是只读的环境中):
using (var connection = (db as DbContext).Database.Connection)
{
using (var command = connection.CreateCommand())
{
command.CommandText = "sp_executesql";
command.CommandType = CommandType.StoredProcedure;
var param = command.CreateParameter();
param.ParameterName = "@statement";
param.Value = @"
CREATE LOGIN readonlyLogin WITH PASSWORD='testpassword'
CREATE USER readonlyUser FROM LOGIN readonlyLogin
EXEC sp_addrolemember 'db_datareader', 'readonlyUser';
";
command.Parameters.Add(param);
connection.Open();
try {
command.ExecuteNonQuery();
} catch (SqlException ex) { // user already exists
if (ex.Errors[0].Number.Equals(15025)) { } else throw ex;
}
}
}
然后,在您的测试项目的连接字符串中:
<add name="readonlyConnection" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;Database=test;Trusted_Connection=False;User Id=readonlyLogin;Password=testpassword;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />