Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 29.10.2013
Сообщений: 74

Странная ошибка при создании функции в PostgreSQL

04.10.2024, 12:56. Показов 627. Ответов 2

Студворк — интернет-сервис помощи студентам
Имеется следующий короткий код на Python. В основе кода используется библиотека psycopg2. Весь код работает в одной транзакции.

Что делает код? Он должен просто создать функцию с именем update_change_time_column(). После создания, функция, естественно, существует одна на всю схему.

Python
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
# Рекомендательная блокировка на момент создания функции
self.exec( "SELECT pg_advisory_lock(12345);" )
 
# Проверка что функция уже есть в БД
resultCursor = self.exec( """SELECT EXISTS (
                          SELECT 1
                          FROM information_schema.routines
                          WHERE routine_name = 'update_change_time_column'
                            AND routine_schema = current_schema()
                          );""" )
isFunctionExists = resultCursor.fetchone()[0]
 
# Если функции нет, она создается
if not isFunctionExists:
    self.exec( """
               CREATE OR REPLACE FUNCTION update_change_time_column()
               RETURNS TRIGGER AS $$
               BEGIN
                 IF current_setting('custom.disable_change_time_trigger', true) IS NOT NULL THEN
                   RETURN NEW;
                 END IF;
 
                 NEW.change_time = now();
                 RETURN NEW;
               END;
               $$ language 'plpgsql';
               """ )
 
# Рекомендательная блокировка снимается
self.exec( "SELECT pg_advisory_unlock(12345);" )
Важно: внешняя система может запустить данный код в параллель. Примерно 10 одинаковых копий этого кода работает одновременно. Не спрашивайте почему, это не моя разработка.

И при работе иногда возникает ошибка:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Ошибка при выполнении SQL-запроса
CREATE OR REPLACE FUNCTION update_change_time_column()
RETURNS TRIGGER AS $$
BEGIN
  IF current_setting('custom.disable_change_time_trigger', true) IS NOT NULL THEN
    RETURN NEW;
  END IF;
 
  NEW.change_time = now();
  RETURN NEW;
END;
 
ОШИБКА:  повторяющееся значение ключа нарушает ограничение уникальности "pg_proc_proname_args_nsp_index"
 
DETAIL:  Ключ "(proname, proargtypes, pronamespace)=(update_change_time_column, , 2200)" уже существует.

Вопрос: почему возникает такая ошибка?

Вроде как предприняты меры по блокировке на время создания функции. Функция создается только в случае, если ее нет. Все обернуто в транзакцию. Что еще надо учитывать чтобы ошибки не возникало?

Если это важно - уровень изолированности транзакций дефолтный, т. е. "read committed".
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.10.2024, 12:56
Ответы с готовыми решениями:

Странная ошибка при создании vector<class> name
Всем доброго времени суток! Потребовалось создать динамический массив из объектов определенного класса, из которого можно удалять и...

Странная ошибка при создании консольного приложения Win32
Вот,решил изучать C++.Поставил Visual C++ 2008 Express.При создании консольного приложения Win32 вот такое окно(см.скрин).Как исправить это...

Ошибка при создании БД PostgreSQL, используя Python и asyncpg
Пытаюсь создать и взаимодействовать с базой данных PostgreSQL, используя Python и asyncpg. При запуске программы постоянно появляются...

2
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
04.10.2024, 14:43
Цитата Сообщение от xintrea Посмотреть сообщение
Вопрос: почему возникает такая ошибка?
1. Где и как проверяется, что pg_advisory_lock установила рекомендательную/клиентскую блокировку??

2. Разделяемые блокировки чтения (не путать с рекомендательными/клиентскими), совместимы при уровне изоляции "read committed", те два одновременно читающих процесса получат одни и те же данные одновременно.

В вашем случае, два процесса прочли, что нет записи и стали создавать ф-ию.
0
106 / 67 / 29
Регистрация: 22.04.2022
Сообщений: 232
04.10.2024, 19:36
В Вашем случае правильнее будет использовать pg_advisory_xact_lock
Просто, не смотря на Ваши блокировки pg_advisory_xxx, остаются блокировки системных таблиц на создание/обновление функций, до конца транзакции
Кстати если использовать pg_advisory_xact_lock - unlock не нужен
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.10.2024, 19:36
Помогаю со студенческими работами здесь

Ошибка при создании функции
Всем доброго времени суток! Нужна помощь. Задачка школьного уровня. С визуал бейсик столкнулся впервые. Суть задачи: заполнение массивов...

Странная ошибка в функции: корректно работает только при наличии точек останова
Есть ф-ция: Function GetPass(ByVal len As Byte) As String Dim out As String = &quot;&quot; Dim chrs As String =...

Ошибка при создании шаблонной функции
template &lt;typename T&gt; int unique_count(const std::vector&lt;T&gt; &amp;vec){ } int main() { std::cout &lt;&lt; unique_count(&quot;Hello world&quot;)&lt;&lt;...

Синтаксическая ошибка при создании функции
Здравствуйте! Подскажите, пожалуйста, как исправить ошибку. Пытаюсь создать функцию в dbeaver, но у меня выходит ошибка: CREATE...

VS2019 странная логика при создании проекта через меню
Если при открытии VS2019 сразу начать создавать проект через кнопку &quot;Create a new project&quot; (Создать новый проект), то на каждом шаге...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru