2008-10-15 54 views
11

Veritabanı şeması güncellemelerini uygulayan komut dosyaları üzerinde çalışıyorum. Tüm SQL güncelleme komut dosyalarını başlangıç ​​işlemi/taahhüt kullanarak kurdum. Bu komut dosyalarını komut satırında psql'ye iletiyorum.Postgresql içinde iç içe geçmiş işlemler 8.2?

Şimdi birden çok komut dosyasını aynı anda ve bir işlemde uygulamanız gerekiyor. Şimdiye kadar sunduğum tek çözüm, başlangıç ​​işleminin/komutunun orijinal komut dizisinden kaldırılması ve ardından yeni bir başlangıç ​​işlem/taahhüt bloğu içinde bir araya getirilmesidir. Bunu yapmak için perl betikleri yazarım.

Etkin olarak postgresql'de nasıl yapılacağını anlayamadığım iç içe geçmiş işlemler istiyorum.

Bu amaç için iç içe geçmiş işlemleri yapmanın veya simüle etmenin bir yolu var mı? Herhangi bir hatadan otomatik olarak kurtulmak için işlerim var, bu yüzden alt düzeylerden herhangi biri başarısız olursa üst düzey işlemlere devam etmem gerekiyor.

cevap

5

PostPres'i kullanarak postgresql içinde iç içe geçmiş işlemleri kullanma olanağınız var.

bu kod örneği ele alalım:

CREATE TABLE t1 (a integer PRIMARY KEY); 

CREATE FUNCTION test_exception() RETURNS boolean LANGUAGE plpgsql AS 
$$BEGIN 
    INSERT INTO t1 (a) VALUES (1); 
    INSERT INTO t1 (a) VALUES (2); 
    INSERT INTO t1 (a) VALUES (1); 
    INSERT INTO t1 (a) VALUES (3); 
    RETURN TRUE; 
EXCEPTION 
    WHEN integrity_constraint_violation THEN 
     RAISE NOTICE 'Rollback to savepoint'; 
     RETURN FALSE; 
END;$$; 

BEGIN; 

SELECT test_exception(); 
NOTICE: Rollback to savepoint 
test_exception 
---------------- 
f 
(1 row) 

COMMIT; 

SELECT count(*) FROM t1; 
count 
------- 
    0 
(1 row) 

Belki bu biraz size yardımcı olacaktır.

+0

Bu durumda kaydetme noktalarını kullanmak için, varolan komut dosyalarını ve bunların nasıl çalıştırıldığını değiştirmeniz gerekir. Bu durumda, eğer bunu yapacak olsaydım, tüm komut dosyalarından başlangıç ​​/ bitiş işlem bloğunu kaldırır ve ayrı ayrı eklerim, aynı anda birden fazla işlem yapmayı kolaylaştırırdım. Teşekkürler! –

0

Sorunumun banttan çıkmasını 'çözdüm' - Giriş komutlarını yeniden başlatmak için giriş komut dosyalarını yeniden çalıştırmak için perl betiğini kullanıyorum, sonra hepsini tek bir dosyaya aktarıyorum. kendi başlangıç ​​işlem/taahhüt.