CREATE RULE(7) | SQL - Dil Deyimleri | CREATE RULE(7) |
CREATE RULE - bir yeniden yazma kuralı tanımlar
CREATE [ OR REPLACE ] RULE isim AS ON olay TO tablo [ WHERE koşul ] DO [ ALSO | INSTEAD ] { NOTHING | komut | ( komut ; komut ... ) }
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.
ALSO ve INSTEAD birlikte belirtilemez. ALSO öntanımlı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.
Ü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.
CREATE RULE, sorgunun tamamını yeniden yazma sistemi olarak bir PostgreSQL oluşumudur.
Nilgün Belma Bugüner <nilgun (at) belgeler·gen·tr>, Nisan 2005
PostgreSQL |