为什么我应该使用存储过程来执行INSERT,UPDATE和DELETE操作?

时间:2014-10-23 10:14:04

标签: sql-server stored-procedures dml

An answer to this question表示“理想情况下,您不会允许针对您的表格进行临时DML,并通过存储过程控制所有DML。”

为什么这是理想的?与对用户需要操作的表进行GRANTING SELECT,UPDATE,INSERT,DELETE相比,这会解决什么问题?

3 个答案:

答案 0 :(得分:4)

视图和存储过程就像一个API。它们允许您隐藏实施,版本更改,提供安全性并防止不幸的客户操作,例如"从公司开始以来获取所有发票的所有字段"。

视图和存储过程允许DBA修改架构以满足性能要求,而不会破坏应用程序。数据可能需要水平或垂直分区,跨文件分割,可能必须添加或删除字段等。如果没有存储过程,这些更改将需要进行大量的应用程序更改。

通过控制每个应用程序使用的存储过程和视图,您可以提供架构更改的版本控制 - 每个应用程序都将看到它所期望的数据库API。

还可以在特定存储过程上分配权限,允许您限制用户可以执行的操作,而无需授予他们对表的完全访问权限。例如,您可以允许普通员工仅更改员工表上的联系人详细信息,但允许HR进行更大幅度的更改。

此外,您可以在单个可测试过程中封装复杂的数据密集型操作,而不是在客户端的源代码中管理原始SQL语句字符串。

使用SQL Server Profiler或动态管理视图,还可以更轻松地跟踪存储过程执行。这允许DBA找到可能导致性能下降的热点和罪魁祸首。

答案 1 :(得分:1)

我认为这遵循一般的想法,即行动应该定义允许的输入并返回预期的输出。对数据或数据库结构进行临时更改的想法会在几个层面上产生风险,但可能需要根据需要进行更新。

zerkms在评论中指出:没有绝对,只有最佳实践。作为最佳实践,如果您能够正确确定预期结果的范围并将用户和流程限制为仅需要的操作和权限,那么您应该确保系统的安全性和完整性。

答案 2 :(得分:1)

为什么需要使用存储过程

,有几个可靠的原因
  1. 存储过程编译一次并以可执行的形式存储,因此过程调用快速有效。可执行代码自动缓存并在用户之间共享。

  2. 存储过程可以避免SQL注入。

  3. 只需一次调用即可执行存储过程中的一组查询。这最大限度地减少了慢速网络的使用,减少了网络流量,并改善了往返响应时间(例如,在批量插入的情况下)。