#postgresql #azure-sql-database #azure-postgresql
Вопрос:
Я настроил небольшой запрос, который использует блок DO для динамического редактирования нескольких таблиц.
DO
$
DECLARE
_table varchar[];
loop_item text;
BEGIN
SELECT array_agg(table_name::TEXT) FROM information_schema.tables
INTO _table
WHERE table_schema = 'public';
FOREACH loop_item IN ARRAY "_table"
LOOP
IF loop_item != 'test' THEN
EXECUTE format('ALTER TABLE %s
ADD COLUMN IF NOT EXISTS new_column varchar;', loop_item);
END IF;
END LOOP;
END;
$
Если инструкция EXECUTE не выполняется, печатается уведомление. Но я также хотел бы знать, когда он был успешно выполнен.
Как я могу захватить и ВЫЗВАТЬ ответное сообщение инструкции EXECUTE?
Информация: Я использую базу данных Azure для Postgres и не имею доступа к файлам конфигурации.
Ответ №1:
Поднимите NOTICE
:
IF loop_item != 'test' THEN
EXECUTE format('ALTER TABLE %I
ADD COLUMN IF NOT EXISTS new_column varchar;', loop_item);
RAISE NOTICE 'Table %s altered', loop_item;
END IF;
Ваш исходный код уязвим для внедрения SQL, и вам следует использовать этот %I
формат.
Комментарии:
1. Мой вопрос был неточным. Это работает для ALTER TABLE, но мне интересно, можно ли захватить вывод, например, SELECT или INSERT, а затем поднять его? Таким образом, я могу удобно выполнять один запрос по многим таблицам.
2.
EXECUTE 'SELECT ...' INTO record_var; RAISE '%', to_json(record_var);