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

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

04.10.2024, 12:56. Показов 673. Ответов 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
670 / 293 / 120
Регистрация: 12.04.2022
Сообщений: 1,002
04.10.2024, 14:43
Цитата Сообщение от xintrea Посмотреть сообщение
Вопрос: почему возникает такая ошибка?
1. Где и как проверяется, что pg_advisory_lock установила рекомендательную/клиентскую блокировку??

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

В вашем случае, два процесса прочли, что нет записи и стали создавать ф-ию.
0
107 / 68 / 29
Регистрация: 22.04.2022
Сообщений: 233
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
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru