对.NET应用程序中的每个SQL调用使用存储过程是最佳做法吗?
是否因为性能原因而鼓励并减少SQL注入攻击的表面区域(在Web应用程序中)?
答案 0 :(得分:9)
与参数化查询相比,存储过程有一些优势:
当使用独占时,您可以关闭应用程序帐户的CREATE,INSERT,SELECT,UPDATE,ALTER,DROP,DELETE等访问权限,这样就可以添加少量的安全
当您有多个使用相同数据库的应用程序时,它们提供一致的,可管理的界面。
即使在部署了应用程序之后,使用过程也允许DBA管理和调整查询。
部署小的更改和错误修复要简单得多。
他们也有一些缺点:
程序的数量可以快速增长到难以维护的程度,而且目前的工具不能提供一个简单的方法来提供充分的文档。
参数化查询将数据库代码放在使用它的地方旁边。存储过程使它远离分离,使得查找相关代码更加困难。
存储过程更难以版本化。
您需要权衡系统的成本/收益。
答案 1 :(得分:4)
没有。
如果您将查询作为参数化查询发送到SQL Server,SQL Server将缓存执行计划并正确清理参数输入以避免SQL注入攻击。
答案 2 :(得分:3)
我更喜欢存储过程而不是内联SQL,因为这样SQL就是一个整合的地方;但是,我更喜欢使用像nHibernate这样的工具,它会为我自动生成SQL,那么你就不用担心SQL了!
答案 3 :(得分:3)
还有一个优点 - 当涉及到调优时,尤其是每个客户,可以使用SP轻松完成(通过添加提示甚至重写代码)。使用嵌入式SQL几乎是不可能的。
答案 4 :(得分:2)
这只是一种做事方式。好处包括将所有SQL代码保存在一个地方,在创建时验证语法,以及能够设置proc的权限,这通常代表某种“动作”并且非常适合概念安全模型。
下行包括任何中型或大型应用程序的大量触发器,以及随之而来的所有内务处理。
我的雇主的产品使用触发器来处理所有事情,我必须说出正确的实践,这是非常可以忍受的。