这似乎是一个非常愚蠢的问题,但我已经进行了搜索,我找不到任何相关内容。
我有一个我在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
答案 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>不会执行任何写入,你可以安全地责怪“其他人”。