TRIGGER (sybase)

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
abdulkadir
Kıdemli Üye
Mesajlar: 489
Kayıt: 13 Eyl 2003 09:10
Konum: istanbul
İletişim:

TRIGGER (sybase)

Mesaj gönderen abdulkadir »

Merhaba

arkadaslar sybase TRIGGER kullanmayı ögrenmek istiyorum ama
bundan öteye gidemedim

saybase cetralden trigger sekmesini tıklayıp add trıgger ile ilerliyorum
bu kodlar olusuyor

Kod: Tümünü seç

CREATE TRIGGER "KAYIT_EKLE" BEFORE INSERT
	ORDER 1 ON "DBA"."MESKEN1"
	/* REFERENCING OLD AS old-name NEW AS new-name */
	FOR EACH ROW
	/* WHEN ( search-condition ) */
BEGIN
	
END
Formumda bulunan ad ve soyad editleri ile ilgili tabloya trıgger ile ekleme nasıl yaparım yazılımı ve kullanımı hakkında hicbir fikrim yok

fahrettin abinin bir makalesi var ama o kodları nerde nereye yazıyoruz
(copy paste ettim olmuyor )
anlamakta zorluk cekiyorum galiba

ufak bir örnek ile yardımcı olabilecek arkadaslara simdiden tesekkürler
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Kod: Tümünü seç

/******************************************************************************/
/****               Generated by IBExpert 4.3.2004 19:24:10                ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES WIN1254;


SET TERM ^ ;


CREATE TRIGGER NAKITISLEMLER_AI0 FOR NAKITISLEMLER
ACTIVE AFTER INSERT POSITION 0
AS
begin
  /* Trigger text */
  /* nakit islem tablolarini hareket tablosuna ekler */
  if (nakitislemler.islemturu = 'ACILIS') Then
      insert into hareketler (hareketler.carikod, hareketler.cariunvan, hareketler.tarih, hareketler.islemturu, hareketler.islem_no,
  hareketler.borc, hareketler.alacak) values (nakitislemler.carikod, nakitislemler.cariunvan, nakitislemler.tarih,
  nakitislemler.islemturu,  nakitislemler.id, nakitislemler.borc, nakitislemler.alacak);
  Else
      insert into hareketler (hareketler.carikod, hareketler.cariunvan, hareketler.tarih, hareketler.islemturu, hareketler.islem_no,
  hareketler.borc, hareketler.alacak) values (nakitislemler.carikod, nakitislemler.cariunvan, nakitislemler.tarih,
  nakitislemler.islemturu,  nakitislemler.islem_no, nakitislemler.borc, nakitislemler.alacak);


  /* cari kart tablosunda gerekli islemleri hallet */
   if (nakitislemler.borc is null) Then
       nakitislemler.borc = 0;

   if (nakitislemler.alacak is null) Then
      nakitislemler.alacak = 0;

    if (nakitislemler.borc = 0) then
    begin
        update carikart SET carikart.alacak = carikart.alacak + new.alacak where CARIKART.carikod = nakitislemler.carikod;
    End
    Else
    if (nakitislemler.alacak = 0) then
    begin
        update carikart SET carikart.borc = carikart.borc + new.borc where CARIKART.carikod = nakitislemler.carikod;
    End

end

SET TERM ; ^
Ben bu trigeri FireBird de hazırladım IbExpert programı ile Trigerlarımı giriyorum. Bunu yazmamın sebebi belki fikir verebilir. Bende yeni başladığımda çok bocalamıştım.

Dostum kolay gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
abdulkadir
Kıdemli Üye
Mesajlar: 489
Kayıt: 13 Eyl 2003 09:10
Konum: istanbul
İletişim:

Mesaj gönderen abdulkadir »

Tesekkür ederim abi

normalde söyle kaydettigimiz alanları

Kod: Tümünü seç

SQL.Add ('INSERT into "alanlar.DB"');
SQL.Add ('(alan1,alan2)') ;
SQL.Add ('values ("'+Edit1.Text+'","'+Edit2.Text+'")') ;
:arrow: 1-trıgger ile nasıl kaydedecegiz?
:arrow: 2-trigger i nasıl cagıracagım?

bir cok denemem bos cıktı yine sordum



Allaha emanet 0lun
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

viewtopic.php?t=644
buradaki makalede ornek olarak kullanılan bir kac tabloluk veritabanını hem Sybase hem de Interbase'de olusturan SQL kodlar var... Bu tablolarin triggerlarinda refferantiel integrity kurallarını işleten trigger kodlari da var.... O makaleyi belki okumuşsundur. Ama tam şu aşamada tekrar okuyup o tabloları sybase'de oluşturup trigger ve stored procedure'leri de benzer şekilde oluşturmanı tavsiye ederim. Oldukça faydalı olacağı kanaatindeyim.....

Kolay gelsin...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Öncelikle Fahrettin Abi nin makalesi çok iyi bir referans bu konuda.

Birincisi Triger lar'a kod yazarken dışardan (Edit nesnesi gibi) veri gönderme veri tabanı içinde ki kayıtlarla ilgili olan işlemleri yap. çünkü başka bir arayüz tasarladığın zaman problemlerle karşılaşmazsın. Mesala delphi ile kayıt girişi yaptığın zaman girilen kayıtların diğer tablolara yansıması gibi. Örnek olarak delphi den fiş kestiğini farzet bu fişte yapılması gereken olaylar olacaktır bunlar çıkılan stok miktarı nı stok kartlarından düşme girilen stok miktarının stok kartlarına işlenme gibi bunu triger çok güzel bir şekilde hallediyor. (Fahrettin abi'nin makalesinde bu konu hakkında ayrıntılı olarak Sybase ve İnterbase ) için örnekleri var.

Kod: Tümünü seç

      insert into Tablo1 (alan1, alan2) values (Tablo2.alan1, Tablo2.alan2);
ikinci sorun ise Triger'ı çağırmana gerek yok çünkü kendisi kayıt ekleme silme ve değiştirme olaylarında kendini veritabanı kısmında tetikliyor.

Umarım yazdıklarım faydalı olur.

Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
abdulkadir
Kıdemli Üye
Mesajlar: 489
Kayıt: 13 Eyl 2003 09:10
Konum: istanbul
İletişim:

Mesaj gönderen abdulkadir »

Arkadaslar kızmayın ama hala anlamıs degilim
bu 2 edite yazılanları db ye eklemek için sizden
hem bu kodu

Kod: Tümünü seç

SQL.Add ('INSERT into "MESKEN1.DB"'); 
SQL.Add ('(alan1,alan2)') ; 
SQL.Add ('values ("'+Edit1.Text+'","'+Edit2.Text+'")') ; 
hemde trigger i buna göre düzenlemenizi isteyebilirmiyim

Kod: Tümünü seç

CREATE TRIGGER "KAYIT_EKLE" BEFORE INSERT 
   ORDER 1 ON "DBA"."MESKEN1" 

   FOR EACH ROW 

BEGIN 
    
END 
Tabii mümkünse
Bir nasıl calıstıgını anlasam gerisi gelir

inanın anlayamadım yani trigger de ne yazılacak
formda ekle butonuna ne yazılacak off kafam bayagı karıstı
siz ufak bir örneklerseniz harika olur

tesekkür ederim
sevgiler
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

Abdülkadir eğer yanlış anlamadıysam, Trigger yazmak için en uygunu veritabanının kendi yönetim araçlarını kullanmak. Fahrettin abi daha iyi biliyordur, hangi yönetim aracı uygun.

Eğer kodla oluşturmak istiyorsan'da bir Query'e ekleyip ExecSQL ile çalıştırmalısın.

Kolay gelsin.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

abdulkadir yazdı:

Kod: Tümünü seç

SQL.Add ('INSERT into "MESKEN1.DB"'); 
SQL.Add ('(alan1,alan2)') ; 
SQL.Add ('values ("'+Edit1.Text+'","'+Edit2.Text+'")') ; 

Kod: Tümünü seç

CREATE TRIGGER "KAYIT_EKLE" BEFORE INSERT 
   ORDER 1 ON "DBA"."MESKEN1" 

   FOR EACH ROW 

BEGIN 
    
END 
Abdulkadir, zaten ilk kod tabloya bir kayit eklemek icin sorunsuz calisacaktir. En azindan benim gozume takilna bir hata goremedim. ExecSql metodunu cagirman yeterli olacaktir.

Trigger yazmaya gelince bu tabloya bu iki alandan olusan kaydı ekleme ile dogrudan ilgili bir trigger yok aslinda.....
yani buna gore trigger duzenlemekten kastettigin bir trigger mantıgı yok ortada...

trigger'in ne demek oldugu bahsettigim makalede vardi. Kabaca ustunden gecersek. Senin bir tablona kayıt eklendiginde, kayıt silindiginde ve kayıt update edildiginde calistirilmasini istedigin kodlar varsa bu kodlar triggerlardir iste... Delphi tarafinda after insert'te after delete'te kod yazmak gibi....

Simdi sen bu kayıtlar eklenince otomatik olarak birsey yapılmasını istiyorsan bu istedigini trigger ile yaparsın. Yoksa da yazacak bir trigger yok ortada.... Bu kayitlar eklendiginde ne yapılabilir dersen eger. Mesele refferantial integrity yani veributunlugunu saglamaya yonelik bir trigger yazabilirsin.... Yani mesela tablonda URUN_NO alanı varsa bu alana girilen degerin URUN tablosunda kayitli bir URUN olup olmadigini kontrol edip degilse hata vererek o kaydin girilmesine engel olabilirsin..... bununn ornekleri makalede var... yani makaledeki veritabanını olusturma kodunu calistirirsan Sybase Central ile bakacagin tablolarin triggerlarini gorebilir ve uzerlerinde oynayabilirsin...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
abdulkadir
Kıdemli Üye
Mesajlar: 489
Kayıt: 13 Eyl 2003 09:10
Konum: istanbul
İletişim:

Mesaj gönderen abdulkadir »

Hay allah
Abi ben normal procedure yazar gibi yazıp cagıracam diye düsünüyorum hep bu mantıkla yogunlastım simdi daha iyi anladım

db işlemlerinde ek olarak isletmek istedigin oto hesap,kayıt vs.
simdi senin makaleni daha iyi anladım
Bir tablo üzerinde bu olayların öncesinde ve sonrasında tetiklenecek istenildiği kadar trigger yazılabilir.
benim 1 adet tablom var 69000 kayıtlı biraz agır calısıyor
trigger kullanayımda hızlı olsun hesabını yapıyordum :lol:

Abi baska birsey danısayımmı :D
Aynı alanlara sahip 4 adet table ve yaklasık 200.000.000 adet kayıt var
bunları tek table haline getirebilirim ama hız bakımında sorun olur gibime geliyor ne dersiniz
Hangisi daha işlevsel olur

Cok tesekkür ederim hayırlı işer
abdulkadir
Kıdemli Üye
Mesajlar: 489
Kayıt: 13 Eyl 2003 09:10
Konum: istanbul
İletişim:

Mesaj gönderen abdulkadir »

husonet yazdı: ikinci sorun ise Triger'ı çağırmana gerek yok çünkü kendisi kayıt ekleme silme ve değiştirme olaylarında kendini veritabanı kısmında tetikliyor.
Aslında bana hersey varolanı anlatıyor
Ama ben illaki var ettigimi istiyorum :lol:
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

DB tarafında çalışan birkaç türlü kod var.

Eğer kayıt ekledikten, sildikten, güncelledikten sonra, otomatik birşeyler yapılmasını istiyorsan trigger ideal. Yok kendin bir takım hesaplamalar yapıyorsan veya bazı işlemleri hızlı yapmak istiyorsan Stored Procedure ideal.

Kolay gelsin.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

eger bu tablolar sonucta aynı amacli ise tek tablo olmali...
yani ornegin bu bir adres datası olsun mesela istanbul'daki butun evlerin adresi....
eger bu tarz bir sey ise bu datalar uzerinden muhtemelen toplu sorgulamalar olacagi icin.... tek tablo olması daha uygun.... eger bolunurse neye gore bolunecek sorusu onemli bolunen kriter dısındaki kriterlere gore sorgulamalar sorun olur bu sefer. Yani mesela ilcelere gore bolduk diyelim. İstanbul'daki 10 kattan buyuk binalari bulan bir sorguyu yazdigin zaman her tablodan ayri ayri sonuclari buldurmak gibi engeller cikacaktir....

Bir de gerekli indexler olursa ve Delphi tarafinda TTable yerine TQuery kullanmak gibi optimizasyonlarla hız sorunu asilabilir...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
abdulkadir
Kıdemli Üye
Mesajlar: 489
Kayıt: 13 Eyl 2003 09:10
Konum: istanbul
İletişim:

Mesaj gönderen abdulkadir »

Hepinize tesekkür ederim
Cevapla