创建存储过程和SQLite?


Answers:


216

SQLite必须牺牲某些人认为有用的其他特征,例如高并发性,细粒度的访问控制,丰富的内置函数集,存储过程,深奥的SQL语言功能,XML和/或Java扩展,tera-或PB级可伸缩性等

资料来源:SQLite的适当用途


3
您可以使用等效于SQL CLR函数的SQLite来实现相同的目标(stackoverflow.com/questions/172735/…)。
devinbost 2014年

@bostIT感谢您的添加。引用System.Data.SQLite system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
h3xStream

91

这就是原因 ...我认为将proc存储在数据库中的一个主要原因是您正在以与SQL引擎相同的过程执行SP代码。对于设计为网络连接服务的数据库引擎来说,这很有意义,但是考虑到SQLite在应用程序进程中而不是在单独的SQL引擎进程中作为DLL运行,对于SQLite的要求要小得多。因此,实现所有业务逻辑(包括使用宿主语言编写的SP代码)更加有意义。

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


16
需要澄清的是...我并不是说没有理由在SQLite中实现SP-仅比其他DB引擎少得多的理由。
Tony O'Hagan

4
具有存储过程的关键原因是为了防止SQL注入。但是,还有许多其他原因。例如,能够通过将相关查询嵌入到sqlite文件中来共享相关查询。在SQL引擎的上下文中运行的标准查询与选择SP之间绝对没有区别。它们都在SQL ENGINE上运行。
2015年

4
@Dan首先,SP甚至早在想到SQL注入之前就已经存在。没有这些工具,就已经构建了成千上万个基于SQL的应用程序,这些应用程序可以抵抗这种攻击。我还通过代码审查了不安全的SP,这些SP容易受到SQL注入的影响(通常基于动态SQL)。所以不,这不是主要原因。还有很多其他方法可以防止这种攻击进一步加剧。
Tony O'Hagan

3
@Dan大多数SQL引擎是客户端/服务器(不是SQLite!),对于这些来说,性能是决定业务逻辑放置位置的关键问题。在SQL引擎中的SP内执行查询或中间或条件代码的业务逻辑可以(1)改善数据检索性能,(2)减少网络流量(3)减少应用层内存使用(4)缓存查询执行计划(预编译) SPs)。大多数应用程序开发人员都喜欢将其一些业务逻辑移到SQL引擎之外(显然不是查询!)。对于SQLite的,这是一个势在必行的,因为它不支持客户端/服务器。
Tony O'Hagan

谢谢,托尼。我想知道为什么SQLite没有过程但具有内置函数(sqlite.org/lang_corefunc.html)?对于客户端服务器RDBMS(例如postgresql),函数和过程都存储在服务器端是否正确?由于SQLite是无服务器的,因此如果SQLite没有过程,那么出于同样的原因,它也应该没有功能吗?
蒂姆(Tim)


7

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.