只读数据库连接字符串

时间:2010-01-15 10:26:24

标签: asp.net asp.net-mvc

这似乎是一个非常愚蠢的问题,但我已经进行了搜索,我找不到任何相关内容。

我有一个我在web.config中创建的数据库连接字符串: -

<connectionStrings>   
<add name="DBConn" connectionString="Data Source=<db svr>;Initial Catalog=<dbname>;Integrated Security=True" providerName="System.Data.SqlClient />   
</connectionStrings>

Data Source=<db svr>;Database=<db name>;User ID=<uname>;Password=<pword>;

但我需要这个连接只读。我已经定义了所有我的linq对象只有获取它们的属性,并且我的(MVC)存储库类都没有.SubmitChanges()方法,所以我99%肯定系统无法更新这个数据库,但我如果可能的话,还想将我的数据库连接设置为RO。我意识到理想情况下这应该在SQL服务器端完成,用户应该成为RO,但是(由于各种原因,我无法控制)无法完成,所以我想锁定我的连接作为应用程序不得写入数据库。

我是否可以将“readonly”参数应用于连接字符串,以便在尝试进行任何更新时抛出错误或丢弃数据?

重申一下(我在第一个回答时,在另一个论坛上提出这个问题是“更改你的数据库凭据”)我不能以任何方式更改数据库访问凭据,这些是RW和任何改变它们的尝试(当前)崩溃SQL Server DB。这不是我的问题,我不能解决这个问题,所以这就是为什么我想看看数据库连接RO,因为它绝对,积极地必须杀死每一个......错误,我的意思是绝对的,积极的无法更改数据库数据。

干杯

MH

4 个答案:

答案 0 :(得分:7)

不,没有办法(我知道)。不幸的是,正确的方法是更改​​当前用户的授权,或创建仅具有select权限的新用户。我意识到这不是您正在寻找的答案,但是当您尝试更改其中的内容时,让Sql Server崩溃似乎是一个值得研究的问题。是因为您使用“sa”帐户连接?如果是这样,您应该创建另一个用户并向新用户授予适当的权限。

答案 1 :(得分:6)

您拥有的是访问代码(L2S)的类。 我建议在部分类中覆盖datacontext的SubmitChanges,以便什么都不做(甚至抛出错误!)(或实现属于你的datacontext的所有可扩展性方法InsertObject,UpdateObject或DeleteObject)

答案 2 :(得分:4)

这实际上取决于您使用的数据库和数据库提供程序。有些允许对连接字符串进行只读访问,有些则不允许。

例如:

SQL Server 2005 CE在为SQL Server Mobile使用.NET Compact Framework数据提供程序时,可能有File Mode=Read Only;个参数。 (见connectionstrings.com)。

SQL Server 2008,doesn't

您可以在connectionstrings.com上查看更多内容。

答案 3 :(得分:1)

在连接字符串级别没有什么可以阻止除了更改用户之外的写入 - 你已经说过你不能这样做了。

在这种情况下,您只需在代码中尽最大努力防止任何写入;即:

  • 任何公共图层都不应公开更新/删除/插入语义或其他任何内容。
  • 使任何数据层类密封,以便不能覆盖

但是,仍然没有什么能阻止程序员出现,删除你的连接字符串,并将其粘贴在自己的Connection中以执行写入。

因此,你可以将连接字符串移动到其他只有内部代码知道如何访问的地方(它仍然是文本文件驱动的,但是,不要使用代码常量!);它仍然没有阻止任何人使用它 - 但它使它变得更加困难。

(补充)我应该解释为什么它不能保护它。

除了连接字符串本身的来源可能是可访问的,即使使用加密库等保护,除了信任级别之外,没有什么能阻止我反映你的代码并调用它。您可以选择整个混淆路线以防止我解构您的代码;但你的开发公司当然不需要这种程度的偏执吗?

但是,最终,因为它是'SEP'(别人的问题),因为你说它,你无法控制它 - 如果有人问你为什么,尽管你尽了最大的努力,你不能保证< / i>不会执行任何写入,你可以安全地责怪“其他人”。