Postgres中的动态FROM子句

时间:2014-08-10 19:40:13

标签: postgresql postgresql-9.1 dynamic-sql window-functions

使用PostgreSQL 9.1.13我已经编写了以下查询来计算一些数据:

WITH windowed AS (
    SELECT a.person_id, a.category_id,
        CAST(dense_rank() OVER w AS float) / COUNT(*) OVER (ORDER BY category_id) * 100.0 AS percentile
    FROM (
        SELECT DISTINCT ON (person_id, category_id) *
        FROM performances s
        -- Want to insert a FROM clause here
        INNER JOIN person p ON s.person_id = p.ident
        ORDER BY person_id, category_id, created DESC
    ) a
    WINDOW w AS (PARTITION BY category_id ORDER BY score)
)
SELECT category_id,percentile FROM windowed 
WHERE person_id = 1;

我现在想把它变成一个存储过程,但我的问题是,在那里,我展示了注释,我需要放置一个动态WHERE子句。例如,我想添加类似的内容:

WHERE p.weight > 110 OR p.weight IS NULL

调用应用程序让人们选择过滤器,因此我希望能够将适当的过滤器传递给查询。可能有0个或多个过滤器,具体取决于调用者,但我可以将其全部作为正确格式化的where子句作为字符串参数传递。例如。

调用应用程序只是将值发送到Web服务,然后构建字符串并调用存储过程,因此SQL注入攻击确实不是问题。

1 个答案:

答案 0 :(得分:0)

  

调用应用程序只是将值发送到Web服务,然后   构建字符串并调用存储过程,因此SQL注入   攻击确实是一个问题。

太多厨师破坏了肉汤。

让你的webserive构建SQL语句让Postgres做到这一点。不要在同一个查询中使用它们。这为SQL注入攻击留下了两个可能的弱点,使调试和维护变得更加困难。

这是完整代码示例,用于 plpgsql函数,它可以动态构建和执行SQL语句,同时使SQL注入无法进行(仅限两天前):

细节在很大程度上取决于具体要求。