Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Передача параметра в функцию / 5 сообщений из 5, страница 1 из 1
22.01.2022, 18:54
    #40128702
Oda412
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметра в функцию
Здравствуйте!
У меня есть функция, которая подключается к другой базе данных и вносит в ее таблицу данные.
Ниже приведен фрагмент кода:

Код: sql
1.
PERFORM dblink_exec('INSERT INTO table2(fio) VALUES(v_fio);');



Но дело в том, что v_fio - это параметр
Научите, пожалуйста, как его правильно прописать в этой строчке?
...
Рейтинг: 0 / 0
23.01.2022, 12:51
    #40128780
Oda412
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметра в функцию
Доброе утро! Распишу порядок действий подробнее:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
-- Создаем первую БД bd1
CREATE DATABASE bd1;
-- Создаем в ней таблицу table1
CREATE TABLE table1(
	id1 BIGSERIAL PRIMARY KEY,
	f1 TEXT); 

-- Заполняем таблицу table1:
INSERT INTO table1(f1) VALUES ('Иванов');
INSERT INTO table1(f1) VALUES ('Петров');
INSERT INTO table1(f1) VALUES ('Кошкина');
	
-- Создаем вторую БД bd2
CREATE DATABASE bd2;
-- Создаем в ней таблицу table2
CREATE TABLE table2(
	id2 BIGSERIAL PRIMARY KEY,
	fio TEXT);

-- Создаем в bd1 функцию, которая вставляет в таблицу table2 значения из таблицы table1 по параметру p1
	
CREATE OR REPLACE FUNCTION bd1_bd2(p1 INTEGER)
RETURNS VOID
LANGUAGE plpgsql
AS $$
DECLARE
v_fio TEXT;

BEGIN
	SELECT f1 FROM table1 WHERE id1=p1 INTO v_fio;
	PERFORM dblink_connect('host=localhost user=postgres password=111 dbname=bd2'); -- ПАРОЛЬ ПОМЕНЯЙТЕ НА ВАШ
	PERFORM dblink_exec('INSERT INTO table2(fio) VALUES(' || v_fio || ');');
	PERFORM dblink_disconnect();
	RETURN;
END;
$$;

-- Устанавливаем расширение dblink
CREATE EXTENSION dblink;
-- Вызываем в bd1 эту функцию:
SELECT bd1_bd2(3);

-- Заходим в bd2 и ожидаем, что в table 2 вставится новая строчка с Кошкиной. Но вместо этого появляется сообщение о том, что столбец "Кошкина" не существует


Все пояснения в комментариях кода. Помогите, пожалуйста
...
Рейтинг: 0 / 0
23.01.2022, 13:24
    #40128786
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметра в функцию
Oda412
Код: sql
1.
PERFORM dblink_exec('INSERT INTO table2(fio) VALUES(''' || v_fio || ''');');

...
Рейтинг: 0 / 0
23.01.2022, 15:45
    #40128810
Oda412
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметра в функцию
court,

Работает. Благодарю от всей души!! :)
...
Рейтинг: 0 / 0
23.01.2022, 17:10
    #40128829
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметра в функцию
court
Oda412
Код: sql
1.
PERFORM dblink_exec('INSERT INTO table2(fio) VALUES(''' || v_fio || ''');');



Оох с такими советчиками никаких хакеров не надо...
Предлагаю проверить что этот код сделает при значении v_fio вида
a'); drop table table2; select ('a

ну хотя бы quote_literal бы добавили а ещё лучше через format конечно такие строки генерить
https://www.postgresql.org/docs/14/functions-string.html#FUNCTIONS-STRING-FORMAT
а не склеивать а потом получать sql injection от школьников.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Передача параметра в функцию / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]