代码之家  ›  专栏  ›  技术社区  ›  Mad Halfling

只读数据库连接字符串

  •  9
  • Mad Halfling  · 技术社区  · 15 年前

    这似乎是一个非常愚蠢的问题,但我已经四处搜索过了,找不到任何关于这个的信息。

    我在web.config中创建了一个db连接字符串:

    <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对象,它们的属性只有get,而我的(mvc)存储库类中没有.submitchanges()方法,所以99%的人确信系统不能更新这个db,但如果可能的话,我还想将db连接设置为ro。我知道理想情况下,这应该在SQL Server端完成,用户应该被设置为ro,但是(由于各种原因,在我的控制之外)无法完成,所以我想锁定我的连接,因为应用程序不能写入数据库。

    是否有一个“readonly”参数可以应用于连接字符串,以便在尝试更新时引发错误或丢弃数据?

    只是重申一下(我在另一个论坛上问这个问题的第一个答案是“更改您的数据库凭据”),我不能以任何方式更改数据库访问凭据,这些是rw,任何更改它们的尝试(当前)都会使SQL Server数据库崩溃。这不是我的问题,我无法解决这个问题,所以这就是为什么我要考虑让DB连接Ro绝对地、积极地杀死每一个……呃,我的意思是绝对不能改变数据库数据。

    干杯

    马来酸酐

    4 回复  |  直到 15 年前
        1
  •  6
  •   ignatandrei    15 年前

    您控制的是类访问代码(L2S)。 我建议在分部类中重写DataContext的SubmitChanges,以便什么都不做(甚至抛出一个错误!)(或实现属于您的DataContext的所有扩展性方法InsertObject、UpdateObject或DeleteObject)

        2
  •  7
  •   Klaus Byskov Pedersen    15 年前

    不,没有办法(我知道)。不幸的是,正确的方法是更改当前用户的授权,或者创建一个只有选择权限的新用户。我意识到这不是您要寻找的答案,而是当您试图更改中的内容时,SQL服务器崩溃,这似乎是一个真正值得研究的问题。是因为您正在使用“sa”帐户进行连接吗?如果是这样,您应该创建另一个用户并向新用户授予适当的权限。

        3
  •  4
  •   Oded    15 年前

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

    例如:

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

    SQL Server 2008, doesn't .

    您可以查看更多 connectionstrings.com .

        4
  •  1
  •   Andras Zoltan    15 年前

    在连接字符串级别上,除了更改用户(您已经说过不能这样做),没有什么可以阻止写入操作。

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

    • 任何公共层都不应该公开更新/删除/插入语义或其他内容。
    • 使任何数据层类都被密封,以便它们不能被重写

    然而,仍然没有什么能阻止程序员来,撕开你的连接字符串,并将它插入到他们自己的连接中来执行写操作。

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

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

    撇开连接字符串本身的源很可能是可访问的,即使通过使用加密库等进行保护,除了信任级别之外,没有什么能阻止我对您的代码进行反射并调用它。您可能会选择整个模糊的路线来阻止我解构您的代码;但您的开发部门肯定不需要这种程度的偏执?

    不过,归根结底,因为正如你所说,这是“SEP”(别人的问题),你无法控制这个问题——如果有人问你为什么,尽管你尽了最大的努力,但你不能 保证 如果不执行任何写入操作,您可以放心地指责“其他人”。

    推荐文章