В Postgres, как получить список текущей определенной точки сохранения?

13

Я использую postgres SAVEPOINT, который создает новую точку сохранения в текущей транзакции, и хотел бы отобразить список определенных в настоящий момент точек сохранения в соединении.

Чтобы быть более точным: я хотел бы проверить, какое имя НЕ будет вызывать ошибку «нет такой точки сохранения» в соединении.

vaab
источник

Ответы:

8

Интересный вопрос! Краткий ответ: нет .

Длинный ответ: кажется, что не существует никакого существующего способа получить список определенных точек сохранения. Хуже того, кажется невозможным создать расширение PostgreSQL, которое позволило бы вам сделать это: глядя на src / backend / access / transam / xact.c , вы можете увидеть, что такие функции, как RollbackToSavepoint (где это «нет такого»). сообщение об ошибке «точка сохранения», о котором вы упомянули, полагается на переменную CurrentTransactionState, которая объявлена ​​статической для xact.c, т.е. не будет видна глобально для кода расширения.

Теперь, если вы осмеливались и отчаянно пытались сгенерировать список определенных точек сохранения со стороны сервера (в отличие от простого запоминания вашего клиента ...), вы могли бы добавить вспомогательную функцию в xact.c, которая бы отображала это информация для вас. На самом деле вот такой вот патч . Это очень грубое исправление только для иллюстративных целей, и оно просто выдает имена точек сохранения, оно действительно должно возвращать эти имена в виде набора текста.

Относительно того, почему эта функция отсутствует, я предполагаю, что просто нет правдоподобного варианта использования для клиента, нуждающегося в получении списка определенных точек сохранения с сервера. Что бы клиент сделал с этим списком - просто выберите один наугад и ROLLBACKк нему? ROLLBACKдо последнего слепо? Точки сохранения AFAICT полезны только в том случае, если клиент запоминает, какие точки сохранения он определил и где они были, чтобы иметь возможность использовать их.

Джош Купершмидт
источник
Спасибо за этот ответ. Конечно, клиент должен помнить, но в случае сложного многопоточного доступа к одному соединению это будет полезно для отладки клиентского кода! И больше информации, возможно доступной, часто лучше, чем меньше ИМХО.
Вааб
Да, для запуска кода это не имеет смысла. Но для отладки было бы полезно посмотреть, какие точки сохранения открыты. Спасибо за ваш ответ.
Геттли