
(Generators and Triggers) Üreticiler ve Tetikleyiciler:
Interbase de Paradox’ta ki (+) Autoincrement veri tipi yoktur. Aslında bu hemen hiçbir DBMS’de yoktur (MS-SQL vb) ama bu bir eksiklik değildir. Otomatik sayı üretmek için Üreticiler (Generators) ve Tetikleyicilerden (Trigger) yararlanacağız.
Önce bir Üretici tanımlayalım;
CREATE GENERATOR OGRNO_GEN; CTRL + ENTER’a basalım.
Şimdi OGRNO_GEN isimli bir üretici tanımladık.
Ve şimdi bu üreticinin hangi numaradan başlayacağını belirtelim.
SET GENERATOR OGRNO_GEN TO 100
İlk öğrenci numaramız 100’den başlayacak.
Ama burada hemen belirtmeliyim; Eğer bu üreticiyi silmek isterseniz DROP kullanamazsınız. Bunun için Delete komutunu kullanmamız gerekir; üreticiler Interbase’in sistem tablolarına yaratılır ve bunu silmek için:
Kod: Tümünü seç
DELETE FROM RDB$GENERATOR WHERE RDB$GENERATOR_NAME = 'OGRNO_GEN'; CTRL + ENTER
Evet şimdi bu üreticiyi kullanacak bir trigger yazlım.
Trigger Begin Bloğuyla başlar ve END cümlesi ile sona erer. Bir Triger içerisinden Depolanmış yordamlar çağrılabilir. Triggerlar tabloya yazılır. Bir trigger bir olaya bağlı olarak otomatik çalışır.
Şimdi Trigger’ımızı yazalım.
SQL Explorer’ı açalım; Sicil Tablosunu seçip, Trigger üzerine gelip CTRL + ENTER’a basalım
Kod: Tümünü seç
CREATE TRIGGER SICILTRIGGER FOR SICIL BEFORE INSERT POSITION 0 AS
BEGIN
NEW.OGRNO = GEN_ID(OGRNO_GEN,1); /* buradaki 1 in anlamı 1 er artır demektir*/
END
Kod: Tümünü seç
INSERT INTO SICIL (ADI,SOYADI) VALUES ( "M.C.","UYAN");
Select * from sicil
Şimdi başka bir trigger yazalım ve bu trigger Master tablosundaki Öğrenci numarasını değiştirdiğimizde master tabloya bağlı detay tabloların tümünü değiştirsin.
Yine triggerımızı Sicil tablosu üzerine yazıyoruz;
Kod: Tümünü seç
CREATE TRIGGER OGRNOUPDATE FOR SICIL AFTER UPDATE POSITION 0 AS
BEGIN
IF(OLD.OGRNO<>NEW.OGRNO) THEN
BEGIN
UPDATE RESIM SET RESIM.OGRNO = NEW.OGRNO WHERE RESIM.OGRNO = OLD.OGRNO;
UPDATE VELI SET VELI.OGRNO = NEW.OGRNO WHERE VELI.OGRNO = OLD.OGRNO;
END
END
Kod: Tümünü seç
UPDATE SICIL SET OGRNO = 15 WHERE OGRNO = 1;
Kod: Tümünü seç
Select * from sicil
Select * from resim
Select * from veli
Şimdi de Veri kümesi döndüren bir Depolanmış Yordam yazalım.
Kod: Tümünü seç
CREATE PROCEDURE OGRLISTE (
OGRNO1 INTEGER,
OGRNO2 INTEGER /* Uygulamadan gönderilecek parametreler*/
) RETURNS (
ADI VARCHAR(30),
SOYADI VARCHAR(30), /* Yordam dan döndürülecek değerler.*/
OGRNO INTEGER,
VADI VARCHAR(30),
VSOYADI VARCHAR(30)
) AS
BEGIN
FOR /* sorgu başlatılıyor..*/
SELECT SICIL.ADI,SICIL.SOYADI,SICIL.OGRNO,VELI.VADI,VELI.VSOYADI
FROM SICIL,VELI
WHERE SICIL.OGRNO = VELI.OGRNO AND SICIL.OGRNO BETWEEN :OGRNO1 AND :OGRNO2 ORDER BY OGRNO ASC
INTO :ADI,:SOYADI,:OGRNO,:VADI,:VSOYADI
DO SUSPEND;
END
Örnek : ISQL’i açalım DB’ye bağlandıktan sonra;
SELECT * FROM OGRLISTE(47, 59); CTRL + ENTER
Evet sonuç karşımızda 47 ile 59 no arasındaki tüm öğrenciler listelenecektir. Tabii biz kullanıcıların ISQL’e girmesini bekleyemeyiz bunun için aşağıda yazacağınız istemci programdan bu depolanmış yordamı nasıl çağıracağınız açıklanmıştır.
Artık bu Depolanmış Yordamı istemci programınızdan çalıştırabilirsiniz. Bunun için yapmanız gereken Form üzerine TDatabase veya
TIBDatabase, TIBStoredProcedure, TIBQuery alalım. Daha sonra
TDatabase’in DatabaseName = C:\data\dersane.gdb yazalım.
TStoredProc.StoredProcName = “OGRLISTE” ‘ye eşitleyelim ve Query1’e
aşağıdaki sorguyu yazalım. TDataSource ve TDBGrid ‘i de Query1’e bağlayalım.
SELECT * FROM OGRLISTE(:OGRNO1, :OGRNO2)
ve gerekli parametreleride Query1.ParamByName ile vererek Query1.Active = true; yapalım. İşte sonuç karşımızda.
Daha önce de belirttiğim gibi akla şu soru gelebilir, Biz Depolanmış Yordam yerine bu sorguyu doğrudan TQuery nesnesine yerleştirebilirmiyiz. Cevap tabii ki evet ama bu durum da sorgunun işletilmesi daha uzun sürecektir. Üstelik bu işi istemci taafında çözmeniz gerekir. En doğrusu sorguyu yukarıda ki gibi sunucuya yerleştirmektir.
“Yukarıda referans bütünlüğüne sahip güçlü veritabanları yaratmak için kullanılan teknikleri öğrendik. Üreticiler, tetikleyiciler ve depolanmış yordamları kullanmayı ve ilişkisel verilerde filtreleme yapmayı da öğrendik. Kısacası genel hatlarıyla profesyonel bir veritabanı oluşturmak için gerekli temel bilgileri artık biliyoruz. Bu bilgiler iyi bir veritabanı oluşturmamız için bize gereken tüm bilgileri elbette vermemiştir ama sırası geldikçe bunları da öğreneceğiz.”
View :
View’i güvenlik için kullanabileceğiniz gibi karmaşık sorgular kurup bunu view ile sunucu tarafında hızlı bir şekilde çalıştırılmasını da sağlayabilirsiniz. View aslında bir tablonun veya tabloların görüntüsüdür. Eğer view için basit bir güvenlik örneği vermek gerekirse Yukarıda haklardan bahsetmştik biz bir kullanıcıya select hakkı verdiğimizde bu kullanıcı ilgili tablonun tüm alanlarını select edebilecektir. Bazen bunu istemediğimiz durumlar olabilir. Örneğin personel tablosunda ki ücret alanının görülememesi gibi. İşte bu gibi durumlarda view kullanabilirsiniz.
Örnek
Kod: Tümünü seç
CREATE TABLE PERSONEL
(
PERNO DOUBLE PRECISION NOT NULL,
ADI VARCHAR(20),
SOYADI VARCHAR(20),
UCRET VARCHAR(15),
PRIMARY KEY (PERNO)
);
Kod: Tümünü seç
CREATE VIEW PERSONEL_LIST AS
SELECT PERNO, ADI, SOYADI
FROM PERSONEL
Grant select on PERSONEL_LIST to USER1
Evet artık USER1 Personel ücretlerini göremeyecektir. View’lerin başka kullanım alanlarıda karmaşık sorguların view içine yerleştirilip istemci program tarafından kolay ve hızlı sorgular gerçekleştirebilmesidir.
Sonuç Olarak : istemci / sunucu veri tabanı tasarlamanın yararı tartışılmazdır.
1. Network trafiğini rahatlatır.
2. Veritabanın’daki bir uygulama değişikliği tüm client uygulamalara otomatik olarak yansıtılacaktır.
3. Veritabanını geliştirme ve Veritabanı bakım işlerinde geçen zamanı kısaltır.
4. Uygulamanın performansını arttırır
5. vs.vs.....