Etiket arşivi: Mysql

MySQL ile Trigger Oluşturma

Triggerlar ilişkili veri tabanlarında çok önemli özelliklerden bir tanesidir. Trigger’ın anlamı tetikleyici olarak bilinmektedir. Herhangi bir olay gerçekleştiğinde neleri tetikleyeceğinin belirlendiği ve tetiklenme ile nelerin yapılacağının belirtildiği bir SQL kodudur diyebiliriz.

2 çeşit trigger vardır diyebiliriz. Bunlar:

1- Insert, Update, Delete işlemleri esnasında (öncesi-sonrası) tetiklenmesi ayarlanan triggerlar.

2- Create, Drop, Alter işlemleri öncesi ve sonrasında tetiklenmek için hazırlanan triggerlardır.

İlk trigger türünü bir örnek üzerinde açıklayacak olursak:

İlk önce bir tablo oluşturalım.

MySQL> CREATE TABLE uyelik(no INT, ucret DECIMAL(10,2));

 

Bu tablomuzda “no” isminde int tipinde bir değişken ile “ucret” isminde decimal değerde virgülden sonra iki sayının gösterebileceği değişkenler bulunmaktadır.

MySQL> CREATE TRIGGER ins_uye BEFORE INSERT ON uyelik

             FOR EACH ROW SET @sonuc = @sonuc + NEW.ucret;

 

Bu SQL kodumuzda “ins_uye” ismi ile bir trigger oluşturduk. Bunu uyelik tablosunu baz alarak “BEFORE INSERT ON” tetikleyicisini belirttik. Burada “BEFORE INSERT ON” = “Tabloya bir satır ekleme öncesi” koşulunu belirledik. “FOR EACH ROW SET” kelimeleri ile “@sonuc = @sonuc + NEW.ucret” işlemini her bir ekleme gerçekleştiğinde var olan sonuc değerine yeni eklenen satırdaki ucret değerinin eklenmesi söylenir.

Tablomuza birkaç veri ekleyerek sonucu görelim:

MySQL> SET @sonuc = 0;

MySQL> INSERT INTO uyelik VALUES(15,155.21),(25,526.45),(35,-500.00);

MySQL> SELECT @sonuc AS 'Toplam Eklenen Ucret';

+———————-+

| Toplam Eklenen Ucret |

+———————-+

|               181.66 |

+———————-+

Update komutu ile güncelleme üzerine bir trigger belirleyelim:

MySQL> delimiter //

MySQL> CREATE TRIGGER upd_check BEFORE UPDATE ON uyelik

       FOR EACH ROW

       BEGIN

          IF NEW.ucret < 0 THEN

               SET NEW.ucret = 0;

          ELSEIF NEW.ucret > 100 THEN

              SET NEW.ucret = 100;

          END IF;

      END;//

MySQL> delimiter ;

Burada delimiter komutu kod bloğunun ayracı olarak kullanılmaktadır. “upd_check” isminde bir trigger oluşturup uyelik tablosunu baz alarak update işlemi yapacağımızı belirtmişiz. Sonrasında yapılacak işlemlere başlangıç olarak begin komutu ile başlamışız. Gerekli koşullarımızı girdikten sonra koşullar ve bloklar için kapatma komutlarını girip delimiter’ ı da sonlandırıp trigger oluşturma işlemimizi bitiriyoruz.

MySQL> update uyelik set ucret=’129.12′ where ucret=’155.21′;

Yukarıdaki SQL cümleciği, uyelik tablosu içerisinde ucret değeri 155.21 olan değeri değiştirerek 129.12 yapmak için oluşturulmuştur fakat oluşturduğumuz kısıtlama sebebi ile 129.12 değeri yerine 100.00 değeri tablomuza eklenecektir. Select komutu ile tablomuzu görmeye çalıştığımızda çıktımız şu şekilde olacaktır:

+——+———+

| no | ucret |

+——+———+

|   15 |  100.00 |

|   25 |  526.45 |

|   35 | -500.00 |

+——+———+

Bu trigger güncelleme (update) işlemi sırasında eğer güncellenen ucret değeri 0 değerinden küçük ise değeri 0’a eşitleyip gerekli yere ekliyor. 100’den büyük girildiğinde ise 100 değerine eşitleyip gerekli yere ekleme yapıyor.

Oluşturduğunuz triggerları ve ayarlamalarını görmek için;

MySQL> show triggers; //yazmanız yeterli olacaktır...

Oluşturulan triggerları kaldırmak için tablolarda yaptığımız gibi DROP SQL komutunu kullanmamız gerekecektir;

MySQL>  DROP TRIGGER upd_check;

Bu işlem sonrası yapacağım güncellemelerde oluşturduğumuz kısıtlamalar artık olmayacaktır.

Mysql LEFT | Right Join ile tablo birleştirmek

daha önce normal tablo birleştirmeyi  http://www.mehmetmutlu.com.tr/2010/06/06/mysql-ile-birden-fazla-tablolar-ile-calismak/ bağlantıdaki makalemde anlatmıştım ancak, o anlatılan örnekde sadece eşleşen verileri listeliyorduk eğer bize meslek ği olmayan bir veri gelirse listelemiyecekti bunuda mysq de join ile yapıyoruz.

Select kisiler.id,kisiler.adı,meslekler.adı from kisiler left join meslekler on kisiler.meslek= meslekler.id

dediğimiz zaman ise eğer meslek karşılığı yok ise null olarak dönecektir

MySql ile birden fazla tablolar ile çalışmak

kisiler(id(int),adı(char50),meslegi(int))

meslekler(id,adı(char50))

adında 2 adet tablomuz olsun

örnek 1.

select * from kisiler,meslekler where kisiler.meslegi = meslekler.id

dersek mysql bize

kisiler.id | kisiler.adı | kisiler.meslegi | meslekler.id | meslekler.adı

adında sadece “kisiler.meslegi = meslekler.id”  eşleşen verileri listemiş olacak

ancak bize sadece

kisi id , kisi adı ve mesleği gerekiyorsa ise

select kisiler.id,kisiler.adı,meslekler.adı  from kisiler,meslekler where kisiler.meslegi = meslekler.id

komutunu uyğulayıp mysql veri çıktısını select * değilde manual kısıtlamış oluyoruz böylece gereksiz veriden kurtulup performansın artmasına katkıda bulunuyoruz.

Merak Mail Server’de Mail Gönderim Limitleri

El ile tek tek tüm userlere limit belirliyebiliriz ancak otomatik sabit bir değer tanımlıyamıyoruz ancak

mysql trigger kullanarak bunu sabitleştirmek mümkün…

Öncelikle Global ayarlardan domain limitlendirme ve user limitlendirme özelliğini açıyoruz

ardından merak mail in bağlı oldugu veritabanına gidip aşağıdaki sql konudu çalıştırıyoruz. (mysql5.0  ve üzeri)

Domain limitlendirme trigger’i

DROP TRIGGER IF EXISTS ‘update_domain';
DROP TRIGGER IF EXISTS ‘insert_domain';

CREATE TRIGGER ‘update_domain’ BEFORE UPDATE ON ‘domains’
FOR EACH ROW BEGIN
IF new.D_NumberLimit = 0 OR new.D_NumberLimit = 1000 THEN
SET new.D_NumberLimit = 1000;
END IF;
END;

CREATE TRIGGER ‘insert_domain’ BEFORE INSERT ON ‘domains’
FOR EACH ROW BEGIN
IF new.D_NumberLimit = 0 OR new.D_NumberLimit = 1000 THEN
SET new.D_NumberLimit = 1000;
END IF;
END;

User leri limitlendirme triggeri

DROP TRIGGER IF EXISTS ‘update_user';
DROP TRIGGER IF EXISTS ‘insert_user';

CREATE TRIGGER ‘update_user’ BEFORE UPDATE ON ‘users’
FOR EACH ROW BEGIN
IF new.U_NumberSendLimit = 0 OR new.U_NumberSendLimit = 250 THEN
SET new.U_NumberSendLimit = 250;
END IF;
END;

CREATE TRIGGER ‘insert_user’ BEFORE INSERT ON ‘users’
FOR EACH ROW BEGIN
IF new.U_NumberSendLimit = 0 OR new.U_NumberSendLimit = 250 THEN
SET new.U_NumberSendLimit = 250;
END IF;
END;

Bu 2 adet trigger i merak mail mysql import ettikden sonra domain bazlı 100 user bazlı 250ser adet limit olacak bu andan itibaren tüm güncelleme ve ekleme işlemlerinde aktif olacak not: triggerde merak mail de 0 değer girişmiş ve otomatik 250 user için domain içinde 1000 e değiştirecek kendimiz farklı bir limit istiyor isek 100, 500, 1500 vs o zaman trigger pasif olacaktır.