Trigger Hakkında Başka Bir Yazı ....

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
DotCom
Kıdemli Üye
Mesajlar: 1696
Kayıt: 11 Tem 2003 10:30
Konum: İzmir
İletişim:

Trigger Hakkında Başka Bir Yazı ....

Mesaj gönderen DotCom »

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:

Kod: Tümünü seç

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

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
Ve şimdi ISQL i açarak SQL cümlesini çalıştıralım.

Kod: Tümünü seç

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;

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
Şimdi tetikleyiciyi denemek için ISQL’i açalım ve aşağıdaki SQL cümleciğini yazalım.

Kod: Tümünü seç

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 ?

Kod: Tümünü seç

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.

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

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)
);
ş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

Kod: Tümünü seç

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.....
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

estagfirullah canim ne demek.... hepimizin amaci bilgiyi paylaşmak... :)
Cevapla