【发布时间】:2010-10-10 14:08:00
【问题描述】:
我刚开始使用 Linq to SQL,突然想到我真的不需要数据库中的任何存储过程,因为我可以通过 Linq to SQL 进行所有数据访问。
有什么理由用 Linq to SQL 编写存储过程吗?
谢谢。
【问题讨论】:
标签: sql-server-2005 linq-to-sql stored-procedures .net-3.5
我刚开始使用 Linq to SQL,突然想到我真的不需要数据库中的任何存储过程,因为我可以通过 Linq to SQL 进行所有数据访问。
有什么理由用 Linq to SQL 编写存储过程吗?
谢谢。
【问题讨论】:
标签: sql-server-2005 linq-to-sql stored-procedures .net-3.5
恐怕你刚刚踏上了宗教矿井!
是否存储过程是一个非常激烈争论的话题,并且经常(在我看来)归结为一方面是 DB/SQL 专家,另一方面是“普通”开发人员之间的斗争。每一方都想尽可能多地拿走羽绒被。
查看此链接,Stored procedures are bad, m'kay? 以及随后的 LOOOOONG 辩论。
【讨论】:
存储过程非常重要。 LinkToSQL 需要直接访问以插入、更新、删除和选择表中的数据。这意味着,如果您的网站或应用程序未正确检查用户输入,您的数据库就会受到数据库注入攻击。
使用存储过程时,这不是问题,因为登录到数据库的用户没有直接的表访问权限。授予 UI 访问表的存储过程的访问权限,但仅限于存储过程的上下文中。
【讨论】:
通常没有充分的理由在新应用程序中编写存储过程。
原因是有无数更好的技术可以在您的应用程序中执行数据访问。有许多对象关系映射技术可用于数十种语言和平台。
存储过程的一个论点是它们在数据库前面提供了一个抽象 API。问题在于,SQL 对于尝试编写高级业务程序来说是一种非常糟糕的语言。另一个问题是,您将使用 SQL 以外的语言在数据库前面使用 API。 C#、Ruby 和 Haskell 等语言提供了更强大的在数据库前创建 API 的方法,在这些语言中使用时更加自然。
【讨论】:
IMO 少得多,但在某些情况下使用存储过程或表值函数仍然有用。当然,LinqToSQL 并不排除使用存储过程,因此如果需要,您仍然可以使用它们。例如,我使用表值函数对表连接进行参数化查询,以支持多变量过滤器。这可以大大简化您的代码并让您能够优化查询。
【讨论】:
可能与要求所有数据检索通过一组受控存储过程完成的现有数据库进行交互。
或者也许有一个在 Linq2SQL 中很难(不可能?)实现的构造。
【讨论】: