İ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