首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SELECT INTO还是Stored Procedure?

SELECT INTO还是Stored Procedure?
EN

Stack Overflow用户
提问于 2010-06-15 13:43:54
回答 1查看 481关注 0票数 0

这是作为存储过程更好,还是让它保持原样?

代码语言:javascript
复制
INSERT INTO `user_permissions` 
    ( `user_id`, `object_id`, `type`, `view`, `add`, `edit`, `delete`, `admin`, `updated_by_user_id` ) 
    SELECT `user_id`, $object_id, '$type', 1, 1, 1, 1, 1, $user_id 
    FROM `user_permissions` 
    WHERE `object_id` = $object_id_2 AND `type` = '$type_2' AND `admin` = 1

你可以考虑不同的对象,假设你有组和子组。如果有人创建了一个子组,这将使所有有权访问父组的人现在也可以访问该子组。

我以前从未创建过存储过程,但现在看起来可能是时候了。这个调用可能会被经常调用。

我应该创建一个过程,还是性能无关紧要?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-15 14:11:13

来自维基百科Stored Procedure

开销:因为存储过程语句直接存储在数据库中,所以这可以消除在软件应用程序向数据库发送内联(动态) SQL查询时通常需要的全部或部分编译开销。(但是,大多数数据库系统都实现了“语句缓存”和其他机制,以避免重复编译动态SQL语句。)此外,预编译的SQL语句虽然避免了一些开销,但增加了创建最佳执行计划的复杂性,因为并非SQL语句的所有参数都是在编译时提供的。根据特定的数据库实现和配置,将从存储过程与通用查询或用户定义函数中看到混合的性能结果。

避免网络流量:存储过程的一个主要优势是它们可以直接在数据库引擎中运行。在生产系统中,这通常意味着过程完全在专用数据库服务器上运行,该服务器可以直接访问所访问的数据。这样做的好处是可以完全避免网络通信成本。这对于一系列复杂的SQL语句尤其重要。

业务逻辑的封装:存储过程允许将业务逻辑作为嵌入到数据库中,这可以简化数据管理,并减少对客户端程序中其他地方的逻辑进行编码的需要。这可能导致由于使用有问题的客户端程序而导致数据损坏的可能性较小。因此,数据库系统可以在存储过程的帮助下确保数据的完整性和一致性。

访问权限委派:在许多系统中,存储过程可以被授予对数据库的访问权限,而执行这些过程的用户并不直接拥有这些权限。因此,存储过程成为这些用户执行存储过程所做的一切的唯一方法。

针对SQL注入攻击的一些保护:可以使用存储过程来防止这种攻击。即使攻击者插入SQL命令,这些参数也将被视为数据。另外,一些DBMS会检查参数的类型。

Disadvantages

存储过程是“一次定义,多次使用”。如果需要进行任何更改,则必须替换存储过程的(且仅有一个)定义。当然,动态SQL允许随时发出任何SQL查询。对存储过程的任何更改都会立即影响到直接或间接引用它的所有其他软件、报告等(DBMS内部或外部)。并不总是能够确切地确定这些影响是什么,也不可能在不对其他事物产生负面影响的情况下安全地进行哪些更改。

由于各种原因,许多组织严格限制允许谁定义和发出对数据库的查询。因此,程序员和其他用户可能发现他们自己别无选择,只能使用他们可用的存储过程来实现对他们的问题的低效解决方案,而不管这些过程是否适合于这个特定的辅助任务。

虽然与存储过程没有直接关系,但将业务逻辑移动到DBMS是有问题的,因为DBMS是具有更复杂可伸缩性问题的层。此外,一些现代的DBMS系统(特别是Microsoft SQL Server 2000以后的系统)不能提供针对预编译查询使用存储过程的任何性能优势:它们的编译和缓存方式与动态SQL相同。

因此,在您的示例中,您希望获得存储过程的封装优势,并且可能应该这样做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3042793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档