Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.

Ошибка PostgreSQL 2F000: sql_routine_exception — отладка процедур

Обновлено: 26.08.2026  ·  Официальная база знаний
  • Ошибка выполнения функции ERROR: sql_routine_exception (SQLSTATE 2F000).
  • Сбои внутри триггерных функций или хранимых процедур при попытке невалидной модификации данных.
  • Отказ выполнения прямых процедур интеграции 1С с внешними системами через хранимый код PL/pgSQL.

1. Поиск упавшей функции и трассировка стека

Включите детальное логирование в postgresql.conf:

log_min_messages = info
log_min_error_statement = error
log_line_prefix = '%m [%p] %q%u@%d '

-- Примените настройки:
SELECT pg_reload_conf();

2. Добавление блоков перехвата исключений (EXCEPTION) в PL/pgSQL

CREATE OR REPLACE FUNCTION update_order_status(p_order_id bigint, p_status int)
RETURNS void AS $$
BEGIN
    -- Бизнес-логика функции
    UPDATE orders SET status = p_status, updated_at = now() WHERE id = p_order_id;
    
    IF NOT FOUND THEN
        RAISE EXCEPTION 'Order % not found', p_order_id;
    END IF;
    
EXCEPTION 
    WHEN sql_routine_exception THEN
        RAISE WARNING 'Handled SQL routine exception for order %', p_order_id;
    WHEN OTHERS THEN
        RAISE EXCEPTION 'Internal error in update_order_status: % (SQLSTATE %)', SQLERRM, SQLSTATE;
END;
$$ LANGUAGE plpgsql;

3. Проверка типов входных параметров и модификаторов изменчивости

Убедитесь, что функции с побочными эффектами (INSERT/UPDATE) не помечены как IMMUTABLE или STABLE:

ALTER FUNCTION update_order_status(bigint, int) VOLATILE;

4. Отладка через модуль pldbgapi (PL/pgSQL Debugger)

CREATE EXTENSION pldbgapi;
Практический опыт инженера: Не используйте функции с категорией изменчивости IMMUTABLE, если они содержат запросы к таблицам. Оптимизатор кэширует результат при планировании, что приведет к скрытой логической ошибке или сбою 2F000.

Частые вопросы (FAQ)

Что представляет собой класс ошибок 2F в стандарте SQL?

Класс 2F объединяет исключения, происходящие внутри исполняемых модулей ядра СУБД (SQL routines), включая запрет на модификацию данных внутри функций чтения (2F002, 2F003) и попытки несанкционированного вызова SQL.

Влияет ли блок EXCEPTION на производительность функции в PostgreSQL?

Да, секция EXCEPTION создает неявную точку сохранения (subtransaction / savepoint). При миллионах вызовов это создает значительную нагрузку на Transaction ID (xid/subxid).

Использует ли 1С:Предприятие хранимые процедуры на уровне PostgreSQL?

Штатно 1С выполняет большинство операций через параметризованные динамические SQL запросы. Хранимые процедуры обычно применяются в механизмах интеграции или внешних источниках данных.

Как получить полный стек вызовов при ошибке в функции?

Используйте конструкцию GET STACKED DIAGNOSTICS v_stack = PG_EXCEPTION_CONTEXT; внутри блока EXCEPTION.