postgres中SQL以外的语言

时间:2008-09-02 13:32:54

标签: sql database postgresql trusted-vs-untrusted

我最近一直在使用PostgreSQL,我觉得很酷的一点是你可以使用SQL以外的语言来编写脚本函数等等。但什么时候这实际上有用呢?

例如,文档说PL / Perl的主要用途是它非常擅长文本操作。但这不是应该编入应用程序的更多内容吗?

其次,有没有合理的理由使用不受信任的语言?看起来好像任何用户都可以执行任何操作对生产系统来说都是个坏主意。

PS。如果有人可以使PL/LOLCODE看起来有用,则可以获得奖励积分。

7 个答案:

答案 0 :(得分:5)

@迈克:这种想法让我很紧张。我多次听说“这应该是无限可移植的”,但当问到这个问题时:你真的预见到会有任何移植吗?答案是:不。

坚持最低的共同标准可能会严重影响性能,抽象层(ORM,PHP PDO等)的引入也是如此。我的意见是:

  • 现实评估是否需要支持多个RDBMS。例如,如果您正在编写一个开源Web应用程序,那么您至少需要支持MySQL和PostgreSQL(如果不是MSSQL和Oracle)
  • 评估结束后,充分利用您决定的平台

而且顺便说一句:你正在将关系与非关系数据库混合(例如,CouchDB 与RDBMS相当于Oracle),进一步举例说明了对可移植性的感知需求被高估了很多倍的高估

答案 1 :(得分:3)

“是不是[文本操作]更多应该编入应用程序的东西?”

通常,是的。数据库普遍接受的“three-tier”应用程序设计表明,您的逻辑应位于客户端和数据库之间的中间层。但是,有时您需要在触发器中使用某些逻辑或需要对函数进行索引,这需要将某些代码放入数据库中。在那种情况下,所有通常的“我应该使用哪种语言?”问题出现了。

如果你只需要一点逻辑,那么应该使用最便携的语言(pl / pgSQL)。如果你需要做一些严肃的编程,你可能最好使用更具表现力的语言(也许是pl / ruby​​)。这将永远是一个判断电话。

“有没有正当理由使用不受信任的语言?”

如上所述,是的。同样,在可能的情况下,将直接文件访问(例如)放入中间层是最好的,但如果您需要根据触发器(可能需要访问不能直接提供给中间层的数据)来解决问题,那么您需要不受信任语言。这不是理想的,通常应该避免。你肯定需要保护它的访问权。

答案 2 :(得分:1)

现在,DBMS中的任何“独特”或“酷”功能都让我非常紧张。我突然出现皮疹,不得不停止工作直到瘙痒消失。

我只是讨厌不必要地被锁在一个平台上。假设您在数据库中的PL / Perl中构建了一大块系统。或者在SQL Server中的C#或Oracle中的PL / SQL中,有很多示例*。

现在您突然发现您选择的平台无法扩展。或者还不够快。或者其他的东西。更糟糕的是,数据库块上有一个新的孩子(比如MonetDB,CouchDB,Cache,但更酷),它可以解决你所有的问题(即使你唯一的问题,就像我的,有一个uncool数据库平台)。如果不重新编码应用程序的一半,就无法切换到它。

(*不可否认,付费产品在某种程度上试图通过说服您使用其独特功能来锁定您,这不是可以直接针对免费提供商的指控,但效果是相同)。

所以这是对问题第一部分的咆哮。但是,我感到内心深处。

  

是否有正当理由使用   不受信任的语言?这好像是   使它成为任何用户都可以执行的   任何操作都是个坏主意

我的天哪,是的!一种“Perl注射攻击”?几乎值得这么做只是为了看看会发生什么,我已经想到了。

出于上述哲学原因,我想我会传递PL / LOLCODE挑战。虽然我有些惊讶地发现它是现存的东西的链接。

答案 3 :(得分:1)

从我的角度来看,我猜答案是'这取决于'。

有一种观点认为数据操作属于数据库层,因此业务逻辑不需要过分关注操作是如何发生的,它只知道它已经存在。

在数据库层上处理数据的另一个非常好的理由是,如果数据量被破坏意味着网络带宽将成为问题。我曾经不得不对非常大量的数据进行分类。在应用程序层中处理此问题受到通过网络传输所有数据以进行处理所需的时间的严格限制。

然后我在PL / pgSQL中编写了一个分箱算法,它运行得更快。

关于不受信任的语言,我听到了来自Josh Berkus(一位postgres倡导者)的播客,他讨论了postgresql的应用程序,该应用程序将MySQL中的数据作为其处理的一部分,因此通信本身由postgres服务器处理。我不记得完整的细节,我认为它出现在FLOSS Weekly podcast上,这是对PostGRESQL历史的一个非常有趣的讨论以及它所带来的一些问题。

答案 4 :(得分:1)

程序语言的不受信任版本允许您访问系统上的I / O. 如果您需要触发器或发送电子邮件或连接到套接字服务器以发送弹出通知,这可以派上用场。这种类型的东西有很多用途,并且由于postgresql隔离级别,你可以安全地做这样的事情。 您可以在功能中放置检查点,以便在交易失败时发送电子邮件或其他任何不会发出的信息。这样做的好处是它从客户端删除逻辑并将其放在服务器上。

答案 5 :(得分:0)

我认为提供了大多数其他语言,因此如果您定期使用该语言进行开发,您可以放心地编写数据库函数,触发器等。这些功能的用处是提供对数据的控制,尽可能接近数据尽可能。

答案 6 :(得分:0)

我最近用外部语言写的一个有用的存储过程的例子是pl / sql中不可能的'df'版本,它允许SQL表生成器选择具有最多可用空间的表空间运行时。

我使用了plperlu,虽然我必须小心数据输入,但它相对简单。