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
TM 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.
Ü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.