如何强制执行只读的LocalDB连接

时间:2018-01-21 17:47:03

标签: c# entity-framework localdb

大多数人似乎都遇到了相反的问题,但解决方案是"授予对数据库的访问权限。"我想限制对数据库(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" /> 类,如果有帮助的话。

1 个答案:

答案 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" />