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

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



Но дело в том, что v_fio - это параметр
Научите, пожалуйста, как его правильно прописать в этой строчке?
...
Рейтинг: 0 / 0
Передача параметра в функцию
    #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
Передача параметра в функцию
    #40128786
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oda412
Код: sql
1.
PERFORM dblink_exec('INSERT INTO table2(fio) VALUES(''' || v_fio || ''');');

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

Работает. Благодарю от всей души!! :)
...
Рейтинг: 0 / 0
Передача параметра в функцию
    #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
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Передача параметра в функцию
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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