代码之家  ›  专栏  ›  技术社区  ›  Kerry Jones

选择into或存储过程?

  •  0
  • Kerry Jones  · 技术社区  · 14 年前

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

    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 回复  |  直到 14 年前
        1
  •  1
  •   Craig Trader    14 年前

    从维基百科 Stored Procedure :

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

    避免网络流量 少校 存储过程的优点是 他们可以直接在 数据库引擎。在生产中 系统,这通常意味着 过程完全在 专用数据库服务器 直接访问数据 访问。这里的好处是 网络通信成本可以是 完全避免。这变成 对复杂环境尤其重要 一系列SQL语句。

    业务逻辑的封装 : 存储过程允许业务 要作为API嵌入到 数据库,可以简化数据 管理和减少需求 在客户端的其他地方对逻辑进行编码 程序。这可能导致 数据损坏的可能性 通过使用故障客户机 程序。因此,数据库系统 可以确保数据完整性和 在存储的帮助下保持一致性 程序。

    访问权的委托 在许多 系统、存储过程可以 已授予对数据库的访问权限 哪些用户将执行这些 程序不直接有。因此, 存储过程成为 这些用户的方式 不管存储过程做什么。

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

    缺点

    存储过程“定义一次, 多次使用。“如果有任何更改 必要的(一个而且只有一个) 存储过程的定义 必须更换。动态SQL 当然,允许任何SQL查询 随时发布。对A的任何更改 存储过程立即影响 每一个软件,报告, 等(数据库管理系统内部或外部) 直接或间接指 它。不可能总是 确切地确定什么 这些影响也不会是什么 不需要 对其他事物产生不利影响。

    由于各种原因,许多 组织严格限制谁是 允许定义和发出查询 根据数据库。程序员和 因此,其他用户可能会发现 他们别无选择,只能 实施效率低下的解决方案 他们使用存储的内容时遇到的问题 他们可以使用程序, 程序是否 适合这个特定的 辅助任务。

    虽然与存储无关 程序,业务流动 DBMS的逻辑是有问题的,因为 它是一个更复杂的层 可扩展性问题。此外,还有一些 现代DBMS系统(尤其是 Microsoft SQL Server 2000及以后版本) 不提供任何性能优势 将存储过程用于 预编译查询:编译它们 和缓存方式相同 动态SQL

    因此,在您的示例中,您希望获得存储过程的封装好处,并且应该 想做就做 .