【问题标题】:Why can't you define a materialized view using bound parameters in PostgreSQL?为什么不能在 PostgreSQL 中使用绑定参数定义物化视图?
【发布时间】:2019-01-02 03:37:17
【问题描述】:

我已经跟踪了错误消息的来源:

    /*
     * A materialized view would either need to save parameters for use in
     * maintaining/loading the data or prohibit them entirely.  The latter
     * seems safer and more sane.
     */
    if (query_contains_extern_params(query))
        ereport(ERROR,
                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                 errmsg("materialized views may not be defined using bound parameters")));

固定链接:https://github.com/postgres/postgres/blob/ef3109500030030b0e8d3c1d7f2b409d702cc49a/src/backend/parser/analyze.c#L2538)

这是为什么?为什么物化视图需要保存参数?

我正在使用 Elixir,但无法使用 Ecto 创建视图:

Repo.query("CREATE MATERIALIZED VIEW $1 AS
        SELECT * FROM tasks WHERE
          resource_type = $2 AND
          task_type = $3
      ", [view_name, resource_type, task_type])

但是

Repo.query("CREATE MATERIALIZED VIEW \"#{view_name}\" AS
        SELECT * FROM tasks WHERE
          resource_type = '#{resource_type}' AND
          task_type = '#{task_type}'
      ", [])

工作正常。

如果可以的话,请告诉我我错过了什么。

【问题讨论】:

    标签: postgresql elixir ecto


    【解决方案1】:

    在第一种情况下,您正在使用带有占位符的准备好的 SQL 语句,并且您提供值以分别填充这些占位符。物化视图需要存储这些值才能重新运行查询。

    在第二种情况下,您自己在编程语言中构造一个查询字符串,方法是将值注入字符串。然后将查询作为字符串传递,不带占位符和值到 PostgreSQL。在这种情况下,物化视图可以只存储字符串,就是这样。并且能够重新运行查询。

    第二种情况的问题是您可能允许SQL injection 在您的查询中发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      相关资源
      最近更新 更多