Почему вы не можете определить материализованное представление, используя связанные параметры в PostgreSQL? - PullRequest
0 голосов
/ 01 июня 2018

Я проследил, откуда в источнике появляется сообщение об ошибке:

    /*
     * 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}'
      ", [])

отлично работает.

Пожалуйста, скажи мне, что мне не хватает, если сможешь.

1 Ответ

0 голосов
/ 01 января 2019

В первом случае вы используете подготовленный оператор SQL с заполнителями и предоставляете значения для заполнения этих заполнителей отдельно.Материализованное представление потребовало бы сохранить эти значения, чтобы иметь возможность перезапустить запрос.

Во втором случае вы сами строите строку запроса внутри своего языка программирования, вводя значения в строку.И затем вы передаете запрос в виде строки без заполнителей и значений в PostgreSQL.В этом случае материализованное представление может просто хранить строку, и это все.И может перезапустить запрос.

Проблема со вторым случаем заключается в том, что вы можете разрешить SQL-инъекцию в вашем запросе.

...