Postgres'te, tanımlı geçerli kayıt noktasının bir listesi nasıl alınır?


13

Geçerli işlem içinde yeni bir kayıt noktası oluşturmak ve bir bağlantıda şu anda tanımlanmış kayıt noktası listesini görüntülemek istiyorum postgres SAVEPOINT kullanıyorum .

Daha kesin olmak gerekirse: Bir bağlantıda hangi adın "böyle bir kayıt noktası yok" hatasını tetiklemeyeceğini kontrol etmek istiyorum.

Yanıtlar:


8

İlginç soru! Kısa cevap: hayır .

Uzun cevap: Tanımlanmış kayıt noktalarının bir listesini almak için mevcut herhangi bir yol görünmemektedir. Daha da kötüsü, bunu yapmanıza izin veren bir PostgreSQL uzantısı oluşturmak mümkün görünmüyor: src / backend / access / transam / xact.c'ye bakarak , RollbackToSavepoint ( savepoint "belirttiğiniz hata mesajı gelir) xact.c'ye statik olarak bildirilen CurrentTransactionState değişkenine güvenir, yani global olarak uzantı koduna görünmez.

Şimdi, sunucu tarafından tanımlanmış kayıt noktalarının bir listesini oluşturmaya cesaret ediyorsanız ve oldukça çaresizseniz (sadece müşterinizin hatırlatmasının aksine ...), xact.c'ye bunu gösteren bir yardımcı işlev ekleyebilirsiniz. sizin için bilgi. Aslında, işte böyle bir yama . Bu sadece örnekleme amaçlı çok kaba bir yama ve sadece kaydetme noktası adlarını kaydediyor, gerçekten bu adları setof metni olarak döndürüyor olmalı.

Bu özelliğin neden eksik olduğuna gelince, tanımlanmış kayıt noktalarının bir listesini sunucudan alması gereken bir istemci için makul bir kullanım durumu olmadığını düşünüyorum. Müşteri bu listeyle ne yapardı - sadece rastgele birini seçin ve listeye ekleyin ROLLBACKmi? ROLLBACKkörü körüne son? AFAICT kayıt noktaları yalnızca bir müşteri hangi kayıt noktalarını tanımladığını ve bunlardan yararlanabilmek için nerede olduğunu hatırladığında yararlıdır.


Bu cevap için teşekkürler. İstemci elbette hatırlamalıdır, ancak bir bağlantıya karmaşık çok iş parçacıklı erişim durumunda, bu istemci kodunda hata ayıklamak için yardımcı olacaktır! Ve muhtemelen erişilebilir olan daha fazla bilgi genellikle daha az IMHO'dan daha iyidir.
vaab

Evet, kod çalıştırmak için bir anlam ifade etmiyor. Ancak hata ayıklama için hangi kayıt noktalarının açık olduğunu görmek faydalı olacaktır. Cevabınız için teşekkür ederim.
guettli
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.