Sql server 为什么要使用存储过程执行插入、更新和删除操作?

Sql server 为什么要使用存储过程执行插入、更新和删除操作?,sql-server,stored-procedures,dml,Sql Server,Stored Procedures,Dml,声明“理想情况下,您不允许对表使用特殊DML,并通过存储过程控制所有DML。” 为什么这个理想?与向用户需要操作的表授予SELECT、UPDATE、INSERT、DELETE权限相比,这解决了什么问题?我相信这遵循了一个基本思想,即操作应该定义允许的输入并返回预期的输出。对数据或数据库结构进行临时更改的想法会在多个层面上带来风险,但根据需要可能是必要的 虫族在评论中指出:没有绝对,只有最佳实践。作为一种最佳实践,如果您能够正确确定预期结果的范围,并将用户和流程限制为仅使用必要的操作和权限,那么您

声明“理想情况下,您不允许对表使用特殊DML,并通过存储过程控制所有DML。”


为什么这个理想?与向用户需要操作的表授予SELECT、UPDATE、INSERT、DELETE权限相比,这解决了什么问题?

我相信这遵循了一个基本思想,即操作应该定义允许的输入并返回预期的输出。对数据或数据库结构进行临时更改的想法会在多个层面上带来风险,但根据需要可能是必要的


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

我相信这遵循了操作应定义允许输入并返回预期输出的一般思想。对数据或数据库结构进行临时更改的想法会在多个层面上带来风险,但根据需要可能是必要的


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

视图和存储过程就像API一样。它们允许您隐藏实现、版本更改、提供安全性并防止不幸的客户端操作,如“从公司成立以来的所有发票中获取所有字段”


视图和存储过程允许DBA修改模式以满足性能要求,而不会中断应用程序。数据可能需要水平或垂直分区、跨文件拆分、字段可能需要添加或删除等。如果没有存储过程,这些更改将需要大量的应用程序更改

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

还可以为特定存储过程分配权限,从而允许您限制用户可以执行的操作,而无需授予他们对表的完全访问权限。例如,您可以允许普通员工只更改员工表上的联系人详细信息,但允许人力资源部进行更剧烈的更改

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


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

视图和存储过程就像API一样。它们允许您隐藏实现、版本更改、提供安全性并防止不幸的客户端操作,如“从公司成立以来的所有发票中获取所有字段”


视图和存储过程允许DBA修改模式以满足性能要求,而不会中断应用程序。数据可能需要水平或垂直分区、跨文件拆分、字段可能需要添加或删除等。如果没有存储过程,这些更改将需要大量的应用程序更改

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

还可以为特定存储过程分配权限,从而允许您限制用户可以执行的操作,而无需授予他们对表的完全访问权限。例如,您可以允许普通员工只更改员工表上的联系人详细信息,但允许人力资源部进行更剧烈的更改

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


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

有一些充分的理由可以解释为什么需要使用存储过程

  • 存储过程只编译一次并以可执行形式存储,因此过程调用快速高效。可执行代码被自动缓存并在用户之间共享

  • 存储过程避免了SQL注入

  • 存储过程中的一组查询是通过单个调用执行的。这可以最大限度地减少慢速网络的使用,减少网络流量,并提高往返响应时间(例如,在批量插入的情况下)


  • 对于为什么需要使用存储过程,有几个坚实的理由

  • 存储过程只编译一次并以可执行形式存储,因此过程调用快速高效。可执行代码被自动缓存并在用户之间共享

  • 存储过程避免了SQL注入

  • 存储过程中的一组查询是通过单个调用执行的。这可以最大限度地减少慢速网络的使用,减少网络流量,并提高往返响应时间(例如,在批量插入的情况下)


  • 这并不“理想”,甚至不接近。在开发过程中没有绝对性。临时DML的反面并不一定意味着存储过程。存储过程可以独立于代码进行测试。它们可以通过缓存计划进行优化,从而加快执行速度。默认情况下,它们是参数化的,可以防止sql注入。如果需要,可以从数据库中的其他代码引用它们。存储过程中的更改不需要重新编译代码…I