No Postgres, como obter uma lista do ponto de salvamento definido atualmente?

13

Estou usando o postgres SAVEPOINT, que cria um novo ponto de salvamento na transação atual e gostaria de exibir a lista de pontos de salvamento definidos atualmente em uma conexão.

Para ser mais preciso: eu gostaria de verificar qual nome NÃO acionaria o erro "não existe esse ponto de salvamento" em uma conexão.

vaab
fonte

Respostas:

8

Pergunta interessante! Resposta curta: não .

Resposta longa: não parece existir nenhuma maneira de obter uma lista de pontos de salvamento definidos. Pior ainda, não parece possível criar uma extensão do PostgreSQL que permita fazer isso: olhando para src / backend / access / transam / xact.c , você pode ver que funções como RollbackToSavepoint (onde é " A mensagem de erro "savepoint" mencionada por você) depende da variável CurrentTransactionState, declarada estática como xact.c, ou seja, não seria visível globalmente para o código de extensão.

Agora, se você estivesse ousado e desesperado para gerar uma lista de pontos de salvamento definidos do lado do servidor (em vez de apenas lembrar seu cliente ...), você poderia adicionar uma função auxiliar ao xact.c que exibisse isso informação para você. De fato, aqui está exatamente esse patch . Essa é uma correção muito grosseira apenas para fins de ilustração, e apenas os nomes dos pontos de salvamento, eles realmente devem retornar esses nomes como conjunto de texto.

Quanto ao motivo pelo qual esse recurso está ausente, suponho que simplesmente não exista um caso de uso plausível para um cliente que precise buscar uma lista de pontos de salvamento definidos no servidor. O que o cliente faria com essa lista - basta escolher uma aleatoriamente e escolher ROLLBACK? ROLLBACKpara o último cegamente? Os pontos de salvamento AFAICT são úteis apenas se um cliente se lembrar de quais pontos de salvamento ele definiu e onde eles estavam para poder usá-los.

Josh Kupershmidt
fonte
Obrigado por esta resposta. O cliente deve se lembrar, é claro, mas em caso de acesso multiencadeado complicado a uma conexão, isso seria útil para depurar o código do cliente! E mais informações possivelmente acessíveis geralmente são melhores que menos IMHO.
vaab
Sim, para executar código, não faz sentido. Mas, para depuração, seria útil ver quais pontos de salvamento estão abertos. Obrigado pela sua resposta.
guettli