Trigger Hakkında Başka Bir Yazı ....
DotCom07.03.2004 - 19:39:18
Bulduğum Bir Makaleyi Sizlerle Paylaşmak İstedim.. ( Fahrettin abi Kusura bakma ayıp olmamıştır inşallah sana :-( )

(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:

DELETE FROM RDB$GENERATOR WHERE RDB$GENERATOR_NAME = 'OGRNO_GEN'; CTRL + ENTER


Kullanarak silebiliriz.
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

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


Ve şimdi ISQL i açarak SQL cümlesini çalıştıralım.

INSERT INTO SICIL (ADI,SOYADI) VALUES ( "M.C.","UYAN");
Select * from sicil


Yeni kaydımızın OGRNO = 101 olduğunu görürüz. Eğer yeni bir kayıt daha eklersek 102,103 vs olacaktır.

Ş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;

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


Şimdi tetikleyiciyi denemek için ISQL’i açalım ve aşağıdaki SQL cümleciğini yazalım.

UPDATE SICIL SET OGRNO = 15 WHERE OGRNO = 1;


Ana tablodaki 1 nolu öğrencinin numarasını 15 olarak değiştiriyoruz. Ve şimdi bakalım tüm tablolarda değiştimi ?

Select * from sicil
Select * from resim
Select * from veli


Evet tüm tablolarda 1 nolu öğrencinin artık 15 nolu öğrenci olarak görünüyor olması lazım.

Şimdi de Veri kümesi döndüren bir Depolanmış Yordam yazalım.

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


Yukarıda tanımlı yordam görmek istedğiniz aralıkta size öğrencileri veli isimleri ile beraber listelemektedir.
Ö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

CREATE TABLE PERSONEL
(
PERNO DOUBLE PRECISION NOT NULL,
ADI VARCHAR(20),
SOYADI VARCHAR(20),
UCRET VARCHAR(15),
PRIMARY KEY (PERNO)
);


şimdi bu tabloya select yetkisi olan herkes UCRET alanını da select edebilecektir ama biz bunu istemiyoruz. Bunun için hemen bir VIEW yaratacağız

CREATE VIEW PERSONEL_LIST AS
SELECT PERNO, ADI, SOYADI
FROM PERSONEL


Ve kullanıcıya select hakkı verirken PERSONEL tablosuna değilde onun görüntüsü üzerine select hakkı vereceğiz.

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.....
 
fahrettin09.03.2004 - 08:54:29
estagfirullah canim ne demek.... hepimizin amaci bilgiyi paylaşmak... :)
 
NOT : Bu sayfa google'un siteyi indekslemesi içindir. www.delphiturkiye.com/forum/ adresini kullanınız!
1998-2006 www.delphiturkiye.com