PostgreSQL: подстановка параметров для LISTEN? - PullRequest
0 голосов
/ 21 ноября 2018

Здравый смысл требует, чтобы строки SQL-запроса никогда не собирались вручную.Таким образом, все интерфейсы базы данных предлагают замену параметров, и все пользователи используют ее без исключений. *

Я использую PostgreSQL v10.5, nodejs v8.12.0, node-postgres 7.6.1.

Подстановка параметров работает как положено для SELECT утверждений:

> await db.query("select from users where id = 'mic'");
(success, 1 row returned)
> await db.query("select from users where id = $1", ["mic"]);
(success, 1 row returned)

Но не работает для LISTEN утверждений:

> await db.query("listen topicname");
(success)
> await db.query("listen $1", ["topicname"]);
(error: syntax error at or near "$1")

Название темы, которую я хочуслушать динамично.Это исходит из полу-заслуживающих доверия источников, которые не должны контролироваться пользователем.Но зачем идти против всех установленных лучших практик и рисковать?

К сожалению, из моих тестов я боюсь, что PostgreSQL просто не может выполнить подстановку параметров для LISTEN запросов.

Есть ли какие-либорешение или обходной путь для этого?

*) Это утверждение может быть верным только в каком-то утопическом будущем обществе.

1 Ответ

0 голосов
/ 21 ноября 2018

Вы правы, что это невозможно сделать в PostgreSQL.

В качестве обходного пути напишите функцию PL / pgSQL, которая использует динамический SQL , например:

EXECUTE format('LISTEN %L', topicname);

Функция format правильно экранирует строки;в этом случае подходящим является формат %L, который выдает правильно заключенную в кавычки строку L .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...