İ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