CREATE RULE(7)

İSİM
CREATE RULE - bir yeniden yazma kuralı tanımlar

KULLANIM
CREATE [ OR REPLACE ] RULE isim AS ON olay
    TO tablo [ WHERE koşul ]
    DO [ ALSO | INSTEAD ] { NOTHING | komut | ( komut ; komut ... ) }

AÇIKLAMA
CREATE RULE belirtilen bir tabloya uygulanması için yeni bir kural tanımlar. CREATE OR REPLACE RULE ya yeni bir kural oluşturur ya da o tabloda mevcut aynı isimde bir kural varsa o kuralı değiştirir.

PostgreSQL kural sistemi veritabanı tablolarında veri girme, güncelleme veya silme işlemlerini gerçekleştirecek ek bir eylem tanımlamayı mümkün kılar. Başka bir deyişle, bir kural, belirtilen bir tablo üzerinde her komut çalıştırılışında ek komutların çalıştırılmasına sebep olur. Bundan başka, bir INSTEAD kuralı ile bir komutun bir başka komut ile değiştirilebilmesi, hatta hiç çalıştırılmaması da mümkündür. Kurallar, sanal tabloların oluşturulmasında da kullanılabilir. Bir kuralın aslında bir komut dönüştürme mekanizası mı yoksa bir komut makrosu mu olduğunu bilmek önemlidir. Dönüşüm, verilen komutlar çalıştırılmadan önce meydana gelir. Eğer, bir işlemin herbir fiziksel satır için tek tek uygulanmasını istiyorsanız, bunu şüphesiz bir kuralla değil, bir tetikle yaparsınız. Kural sistemi hakkında daha ayrıntılı bilgi edinmek için
http://www.postgresql.org/docs/8.0/static/rules.html adresine bakınız.

Şimdilik, ON SELECT kuralları koşulsuz INSTEAD kuralları olmalı ve tek bir ON SELECT komutundan oluşan eylemler içermelidirler. Bu şekilde, bir ON SELECT kuralı aslında bir tabloyu bir sanal tabloya döndürür, ancak tabloda ne varsa değil, kuralın SELECT komutunun döndürdüğü satırlar kullanılır. Sanal tabloları, önce bir gerçek tablo ardından da buna bir ON SELECT kuralı uygulayıp oluşturmak yerine bir CREATE VIEW komutu yazarak oluşturmak daha iyi bir çözümdür.

Bir sanal tablo üzerinde ON INSERT, ON UPDATE ve ON DELETE kuralları tanımlayıp, diğer tabloların ilgili güncellemelerini bu güncelleme eylemleri ile değiştirerek güncellenebilir bir sanal tablo görüntüsü oluşturabilirsiniz.

Sanal tablo güncellemeleri için koşullu kurallar kullanmak isterseniz bir hileye başvurabilirsiniz: belirteceğiniz her eylemin bir koşulsuz INSTEAD kuralı içermesini sağlamalısınız. Eğer kural, koşullu ise ya da INSTEAD kuralı değilse, sistem güncelleme eylemini uygulamayı hala reddetmeye çalışacaktır. Çünkü, bazı durumlarda, sanal tablonun taklidi üzerinde uygulanacak eylemin sonuna geldiğini varsayacaktır. Eğer, koşullu kurallardaki tüm kullanışlı durumların uygulanmasını istiyorsanız, sistemin asla bir tablo taklidini güncelleme çağrısı yapılmadığını anlamasını sağlamak için koşulsuz bir DO INSTEAD NOTHING kuralı ekleyin. Ardından da INSTEAD içermeyen koşullu kuralları oluşturun; uygulandıkları yerlerde, bunlar öntanımlı INSTEAD NOTHING eylemine eklenir.

PARAMETRELER
isim
    Oluşturulacak kuralın ismi. Bu aynı tablodaki diğer kuralların isimlerinden farklı olmalıdır. Aynı tabloda ve aynı olay türünde çok sayıda kural varsa, bunlar alfabetik sırada uygulanır.

olay
    SELECT, INSERT, UPDATE ve DELETE cümlelerinden biridir.

tablo
    Kuralın uygulanacağı tablo ya da sanal tablonun ismi (şema nitelemeli olabilir).

koşul
    Herhangi bir koşullu SQL ifadesi (boolean döndüren). NEW ve OLD olması ve ortak değer işlevleri içermemesi dışında bu koşullu ifade hiçbir tabloya başvuru yapamaz.

INSTEAD
    Komutların "özgün komutların yerine" çalıştırılacağını belirtir.

ALSO
    Komutların "özgün komutlara ek olarak" çalıştırılacağını belirtir.

    ALSO ve INSTEAD birlikte belirtilemez. ALSO öntanımlıdır.

komut
    Kuralın eylemleri olan komut ya da komutlar. Geçerli komutlar SELECT, INSERT, UPDATE, DELETE veya NOTIFY'dır.

koşul ve komut içinde, özel tablo isimleri NEW ve OLD başvurulacak tablonun değerlerini nitelemek için kullanılabilir. NEW, ON INSERT ve ON UPDATE kurallarında veri girilecek ya da güncellenecek yeni bir satırı belirtirken kullanılabilir. OLD ise, ON UPDATE ve ON DELETE kurallarında güncellenecek ya da silinecek mevcut bir satırı belirtirken kullanılabilir.

EK BİLGİ
Üzerinde bir kural tanımlayabilmeniz için tablo üzerinde RULE yetkiniz olmalıdır.

Döngüsel kurallardan kaçınmaya çalışmanız çok önemlidir. Örneğin, aşağıdaki iki kural tanımı PostgreSQL tarafından kabul edildiği halde sorgunun defalarca baştan uygulanması nedeniyle PostgreSQL bir hata raporlayacaktır:

    CREATE RULE "_RETURN" AS
        ON SELECT TO t1
        DO INSTEAD
            SELECT * FROM t2;

    CREATE RULE "_RETURN" AS
        ON SELECT TO t2
        DO INSTEAD
            SELECT * FROM t1;

    SELECT * FROM t1;

Şimdilik, bir kural eylemi bir NOTIFY komutu içeriyorsa, ne olursa olsun, kuralın uygulanacağı bir satır olmasa bile, NOTIFY komutu çalıştırılır. Örnek:

    CREATE RULE notify_me AS ON UPDATE TO mytable DO ALSO NOTIFY mytable;

    UPDATE mytable SET name = 'foo' WHERE id = 42;

UPDATE sırasında, id = 42 koşulu ile eşleşen bir satır olmasa bile, bir NOTIFY olayı gönderilecektir. Bu, gerçekleme ile ilgili bir kısıtlamadır; ileriki sürümlerde düzeltilebilir.

UYUMLULUK
CREATE RULE, sorgunun tamamını yeniden yazma sistemi olarak bir PostgreSQL oluşumudur.

ÇEVİREN
Nilgün Belma Bugüner <nilgun (at) belgeler·gen·tr>, Nisan 2005