SELECT INTO还是存储过程?

时间:2010-06-15 05:43:54

标签: php stored-procedures mysql

这会更好地作为存储过程还是保留原样?

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

您可以使用不同的对象来考虑这一点,假设您有组和子组。如果有人创建了一个子组,那么现在每个有权访问父组的人都可以访问该子组。

我之前从未制作过存储过程,但这看起来可能是时候了。可能经常调用此调用。

我应该创建一个程序还是表现不重要?

1 个答案:

答案 0 :(得分:1)

来自维基百科Stored Procedure

  

开销:因为存储过程   语句直接存储在   数据库,这可能会删除所有或部分   编译开销的   通常在需要的情况下需要   软件应用程序内联发送   (动态)对数据库的SQL查询。   (但是,大多数数据库系统   实现“语句缓存”等   避免重复的机制   编译动态SQL   声明。)另外,预编译   SQL语句,同时避免一些   开销,增加了复杂性   创建最佳执行计划   因为不是SQL的所有参数   声明在编译时提供   时间。具体取决于具体情况   数据库实现和   配置,混合性能   结果将从存储中看出   程序与通用查询或   用户定义的函数。

     

避免网络流量:一个主要的   存储过程的优点是   他们可以直接在   数据库引擎。在一个生产中   系统,这通常意味着   程序完全在a上运行   专业的数据库服务器,它有   直接访问数据   访问。这里的好处是   网络通信费用可以   完全避免。这变成了   对复杂而言尤为重要   一系列SQL语句。

     

业务逻辑的封装:   存储过程允许业务   要作为API嵌入的逻辑   数据库,可以简化数据   管理和减少需要   在客户端的其他地方编码逻辑   程式。这可能会导致较少   数据被破坏的可能性   通过使用有缺陷的客户端   程式。因此,数据库系统   可以确保数据的完整性   在存储的帮助下的一致性   程序

     

访问权限委托:在很多方面   系统,存储过程都可以   授予对数据库的访问权限   哪些用户将执行这些   程序不直接有。从而,   存储过程成为唯一的   这些用户有这样做的方式   无论存储过程如何。

     

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

     

<强>缺点

     

存储过程“定义一次,   多次使用。“如果有任何变化   必要的,(唯一的)   存储过程的定义   必须更换。动态SQL,   当然,允许任何SQL查询   随时发布。任何改变   存储过程立即影响   所有其他软件,报告,   等(DBMS内部或外部)   直接或间接指的是   它。它并不总是可能的   确切地确定究竟是什么   这些影响将是,也不是   可以安全地进行更改   对其他事情产生不利影响。

     

由于种种原因,很多   组织严格限制谁   允许定义和发出查询   对数据库。程序员和   其他用户可能因此找到   他们别无选择   实施低效的解决方案   他们使用什么存储的问题   程序可供他们使用,   是否程序   适合这个特殊的   辅助任务。

     

虽然与存储没有直接关系   程序,业务的运动   DBMS的逻辑是有问题的   它是更复杂的层   可扩展性问题。此外,一些   现代DBMS系统(特别是来自   Microsoft SQL Server 2000起)   不提供任何性能优势   使用存储过程   预编译查询:它们已编译   并以与...相同的方式缓存   动态SQL。

因此,在您的示例中,您需要存储过程的封装优势,并且应该只是执行

相关问题