Database 数据库允许应用程序始终通过SPs执行CRUD操作是最佳做法吗?

Database 数据库允许应用程序始终通过SPs执行CRUD操作是最佳做法吗?,database,linq-to-sql,database-design,Database,Linq To Sql,Database Design,我听说过这背后的道理,我很好奇其他人是否认为这是一个最佳实践/好主意 一个理由是,对直接访问数据库表施加限制,并强制应用程序/用户使用SP(存储过程)执行CRUD操作,这将允许DBA 细粒度控制,用于在SP投入生产之前批准/审查SP 避免开发人员编写的可能导致服务器负载/其他服务器问题的随机查询 这意味着开发人员不能在表上编写Linq查询(尽管可以使用涉及SP的Linq查询) 这也意味着开发人员必须忘记编译时检查以及完全控制数据,而主要是使用另一种语言(SQL)来处理数据 我不反对,也不认为这是

我听说过这背后的道理,我很好奇其他人是否认为这是一个最佳实践/好主意

一个理由是,对直接访问数据库表施加限制,并强制应用程序/用户使用SP(存储过程)执行CRUD操作,这将允许DBA

  • 细粒度控制,用于在SP投入生产之前批准/审查SP
  • 避免开发人员编写的可能导致服务器负载/其他服务器问题的随机查询
  • 这意味着开发人员不能在表上编写Linq查询(尽管可以使用涉及SP的Linq查询) 这也意味着开发人员必须忘记编译时检查以及完全控制数据,而主要是使用另一种语言(SQL)来处理数据

    我不反对,也不认为这是个好主意。我只是想知道别人怎么想。这种方法还有哪些优点和缺点


    更新:如所述,我倾向于认为SP是逻辑的,使用“SQL中的数据库编程”来执行逻辑是可以的,只要它不是“业务逻辑”。业务逻辑需要分离、编译时检查和集成检查点等等。它在很大程度上取决于您的数据和环境

    如果要使数据库广泛地提供给不同的读者和作者,请使用存储过程:这样可以保持绝对控制


    如果你在一个封闭的商店里信任开发人员,那么使用LINQ。它允许更大的数据访问灵活性,并使未来对数据库的更改变得轻而易举。(例如,如果向表中添加字段,则只需重新生成LINQ数据访问部分类即可;否则,您将不得不重写一堆存储过程,以及更改应用程序中的数据访问层。)

    看起来您不信任开发人员编写性能良好的查询

    这可能是经验使然

    我认为,如果糟糕的开发人员正在编写糟糕的sql代码,那么他们也在编写糟糕的应用程序代码,这意味着管理工作做得很差

    问题不在于动态SQL(即使是参数化的)与存储过程:而是管理不善

    通过存储过程强制db访问并不能解决这个问题

    无论如何,即使只通过存储过程提供对数据库的访问,糟糕的编码人员仍然能够对数据库施加压力

    现实情况是,如果您使数据库中的数据难以获取,开发人员将使用其他技术来避免将数据放入数据库,或破坏数据库。例如,假设您有一个blog字段来存储PDF或其他内容,如何阻止它们序列化对象并将其存储在blob中,以便在代码中检索和反序列化

    我会小心的


    确保存储过程以源代码管理结束,并且可以通过构建工具(连续或每日)自动将存储过程部署到适当的数据库环境。

    另一个明显的好处是性能,一旦编译SP,它们在代码中的执行速度将快于SQL。您已经说明了SP对于关注安全和控制的大型组织的主要好处。这使得DBA更容易在性能出现问题时查看针对DB运行的SQL,因为SQL的所有内容都在DB中

    一个缺点是可移植性,如果您正在编写一个商业应用程序,而客户坚持要您适应他们现有的数据库,那么使用SP比使用内嵌式SQL需要做的工作要多一些

    要使用您的列表:

    这意味着开发人员不需要在表上编写Linq查询。这也意味着开发人员可以忘记对数据库访问代码的编译时检查,让了解数据库的人完全控制数据。开发人员不需要使用其他语言(SQL或Linq)来处理数据


    换句话说,这取决于你的工作环境。

    我所在的团队采用这种方法

    还有其他好处,例如

  • 安全性-如果您没有对基表的直接访问权,那么它可能是深度防御方法的一部分
  • PDM中的灵活性-出于性能原因,您可以对PDM进行大规模更改,并且只要您保留“合同”(SP、视图),应用层就不会察觉
  • FutureProvision—您可以很好地使用另一种语言编写的应用程序来访问您的数据库
  • 当您有一个专门的数据库人员或团队时,它工作得最好


    我饶有兴趣地关注着这个领域,因为它显然与使用ORMs时所需的技术背道而驰

    就我个人而言,我从未发现程序对于CRUD中的“R”来说足够灵活。我通常使用视图。但是通过视图和过程访问数据库也允许您抽象出数据库表,从而使数据模型在将来具有更大的灵活性。。。几乎就像在界面上工作一样。

    是的,尤其是在Oracle中

    在Oracle中,触发器和外键需要许多
    SQL/PLSQL
    上下文开关

    我个人通过以下方式开发需要大型
    CRUD
    操作的数据库:

  • 我既不使用触发器也不使用外键。
    • 未向用户授予对表的修改权限
    • 数据库中的所有
      DML
      都是这样执行的:
    • 要插入/更新/删除的数据加载到
      TEMP
      表中
    • 调用存储过程,其中:
    • 在I/U/D触发器和外键之前检查数据的一致性
      • 数据被合并到表中
      • Da