【问题标题】:Creating stored procedure and SQLite?创建存储过程和SQLite?
【发布时间】:2010-07-26 13:23:53
【问题描述】:

在使用 SQLite 时,是否可以通过某种方式创建存储过程?

【问题讨论】:

    标签: sqlite stored-procedures


    【解决方案1】:

    SQLite 不得不牺牲一些人认为有用的其他特性,例如高并发、细粒度访问控制、丰富的内置函数集、存储过程、深奥的 SQL 语言特性、XML 和/或 Java 扩展、TB 或 PB 可扩展性等等

    来源:Appropriate Uses For SQLite

    【讨论】:

    【解决方案2】:

    答案

    这就是为什么 ...我认为将过程存储在数据库中的一个关键原因是您在与 SQL 引擎相同的进程中执行 SP 代码。这对于设计为作为网络连接服务工作的数据库引擎是有意义的,但 SQLite 的必要性要小得多,因为它在应用程序进程中作为 DLL 运行,而不是在单独的 SQL 引擎进程中运行。因此,实现所有业务逻辑(包括宿主语言中的 SP 代码)更有意义。

    但是,您可以在宿主语言(PHP、Python、Perl、C#、JavascriptRuby 等)中使用自己的 user defined functions 扩展 SQLite。然后,您可以将这些自定义函数用作任何 SQLite 选择/更新/插入/删除的一部分。我已经 done this in C# 使用 DevArt's SQLite 来实现密码哈希。

    【讨论】:

    • 澄清一下……我并不是说没有理由在 SQLite 中实现 SP - 只是比其他数据库引擎少得多。
    • 拥有存储过程的关键原因是为了防止 SQL 注入。然而,还有许多其他原因。例如,能够通过将相关查询嵌入到 sqlite 文件中来共享相关查询。在 SQL 引擎的上下文中运行的标准查询与选择 SP 之间绝对没有区别。它们都在 SQL ENGINE 上运行。
    • @Dan 首先,SP 早在人们想到 SQL 注入之前就已经存在了。数以千计的基于 SQL 的应用程序已经在没有它们的情况下构建,可以安全地抵御这种攻击。我还对易受 SQL 注入攻击(通常基于动态 SQL)的不安全 SP 进行了代码审查。所以不,我不认为这是主要原因。还有很多其他方法可以防止这种攻击进一步上升。
    • @Dan 大多数 SQL 引擎是客户端/服务器(不是 SQLite!),对于这些引擎,在决定将业务逻辑放在何处时,性能是一个关键问题。在 SQL 引擎中的 SP 中执行业务逻辑,无论是查询还是交互或条件代码,可以 (1) 提高数据检索性能,(2) 减少网络流量 (3) 减少应用层内存使用量 (4) 缓存查询执行计划(预编译SP)。大多数应用程序开发人员更喜欢将他们的一些业务逻辑移到 SQL 引擎之外(显然不是查询!)。对于 SQLite,这是 less 的命令,因为它不支持客户端/服务器。
    • 谢谢,托尼。我想知道为什么 SQLite 没有过程但有内置函数 (sqlite.org/lang_corefunc.html) ?对于诸如postgresql之类的客户端-服务器RDBMS,函数和过程都存储在服务器端是否正确?由于 SQLite 是无服务器的,如果 SQLite 没有过程,那么同理,它应该也没有函数吗?
    【解决方案3】:

    如果您仍然感兴趣,Chris Wolf 使用存储过程制作了 SQLite 的原型实现。您可以在他的博文中找到详细信息:Adding Stored Procedures to SQLite

    【讨论】:

    • 文章现在已经死了,但项目在github.com/wolfch/sqlite-3.7.3.p1。自述文件暗示这不是生产就绪的,也不是用于实验的。这似乎更像是一个概念证明。
    【解决方案4】:

    然而,可以使用以您的 fake-sp 命名的专用表和 AFTER INSERT 触发器来伪造它。专用表行包含您的假 sp 的参数,如果它需要返回结果,您可以拥有第二个(可能临时)表(名称与 fake-sp 相关)来包含这些结果。这将需要两个查询:第一个将数据插入到 fake-sp-trigger-table 中,第二个从 fake-sp-results-table 中选择,它可能是空的,或者如果出现问题有一个消息字段.

    【讨论】:

      【解决方案5】:

      不,但你可以:

      • 编写长的多语句脚本
      • 创建名为例如临时单行表Vars 保存变量
      • 在递归CTE 之上创建View 以在纯SQL 查询中编写任意函数。

      因此,您可以执行通常使用存储过程执行的大多数操作。

      有关如何在 SQL View 中编写函数,请参阅 https://www.cafe-encounter.net/p3300/pretending-that-sqlite-has-stored-procedures-and-functions

      您也可以:

      • 编译简短的单页 C 程序以编写任意函数

      这比您想象的更容易,工作量也更少!

      分步指南位于https://www.cafe-encounter.net/p3244/installing-and-using-sqlite-extensions-on-macos-and-maybe-windows-linux-too。这确实增加了一些部署工作:您必须使用您的应用程序部署额外的 dll/so/dylib 文件。

      【讨论】:

      • 为单一平台编译非常简单。为跨多种平台的部署进行编译不容易;你最终被埋在繁琐的细节之下,这些细节在各处都略有不同。也就是说,您也可以使用许多其他语言创建函数,具体取决于您嵌入 SQLite 的内容。
      • 我赞同你的观点 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 2016-11-11
      • 2021-12-08
      • 2017-10-14
      • 2021-07-10
      • 2015-08-27
      • 1970-01-01
      相关资源
      最近更新 更多