1

Konu: Triggers & Stored Procedures kullanımı

Arkadaslar,
Trigger ve Stored Procedure kullanımı hakkında tartisma baslatmak istiyorum. Burada oluşacak yanıtlar ile dökümanlar kısmına bu başlık altında döküman oluşturmayı düşünüyorum, o yuzden konu hakkında deneyimli arkadaslarin bilgilerini aktarmasi ortaya güzel bir dokuman cikmasini saglayacak.

Trigger ve Stored Procedure kullanımı belli bir deneyimden sonra programcı tarafından anlasilir hal aliyor ( en azindan ben   belli bir deneyim kazandiktan sonra bu tip kullanım ihtiyacim oldu )


1-kullanım gereksinimleri nelerdir ?
2-hangi durumlarda kullanilmali veya kullanılmamalidir ?
3-performansa etkisi nedir ?
4-hangi durumlarda programcıyı defalarca kod kopyala+yapıstırdan kurtarir ?
5-özellikle kullanilmasi gerekli durumlar varmıdır varsa nelerdir ?
6-cesitli amaclar icin olusturulmus kod ornekleri nelerdir ?

ve daha aklıma gelmeyen ama bu konuya dahil olabilecek diger basliklar....

deneyimli arkadaslarin katkılarını bekliyorum...

2

Re: Triggers & Stored Procedures kullanımı

1- SPler daha hızlı sonuç almak için kullanılırlar. Normal SQL göre hızlıdır. (.NET için daha yavaş kaldığı söyleniyor.) Kod içerisinde olmadığından uygulamadan bağımsız olarak güncellenebilirler. Temel kullanıım nedenleri bunlar. TRG ise genel olarak yapılması gereken iş silselesi gibi düşünülebilir. Fakat tanıdığım programcılar bunu kod içerisinde (SP olarakta) kendi kontrollerinde yapmayı tercih ediyorlar.
2- Her durumda kullanılabilir.
3- SQLin yorumlanması Veri tabanı tarafından gerçekleştiğinden performansı olumlu yönde etkiler.
4- SP olarak normal bir kod gibi düşünmemelisin. Tamamen veritabanı üzerinde çalıştığından yapacağın işe yönelik kod yazmalısın. Burada performansa yönelik düşünmek daha önde gelir.
5- Aynı veritabanını kullanan birden fazla uygulamalarda VT işlemleri için ortak geçiş noktası oluşturabilirler. Bu şekilde tüm veritabanı işlemlerini belli bir noktada toplamış olursunuz.

3

Re: Triggers & Stored Procedures kullanımı

Visual Fox Pro
*CREATE TABLE userlog (id i, terminal c(30),tarihsaat d,hareket c(1),tableismi c(20),kayitno n(10),aciklama c(50))

 
Procedure userekle
Local lalias,lrecno
lalias=Alias()
lrecno=Recno()
If Used("userlog")
    Select userlog
Else
    Use userlog In 0
Endif
Insert Into userlog (terminal,tarihsaat,hareket,tableismi,kayitno) Values (Alltrim(Sys(0)),Datetime(),'E',lalias,lrecno)
Return .T.
 
Procedure usersil
Local lalias,lrecno
lalias=Alias()
lrecno=Recno()
If Used("userlog")
    Select userlog
Else
    Use userlog In 0
Endif
Insert Into userlog (terminal,tarihsaat,hareket,tableismi,kayitno) Values (Alltrim(Sys(0)),Datetime(),'S',lalias,lrecno)
Return .T.
 
Procedure userduzelt
Local lalias,lrecno
lalias=Alias()
lrecno=Recno()
If Used("userlog")
    Select userlog
Else
    Use userlog In 0
Endif
Insert Into userlog (terminal,tarihsaat,hareket,tableismi,kayitno) Values (Alltrim(Sys(0)),Datetime(),'D',lalias,lrecno)
Return .T.

Ben sadece user log için kullanıyorum.
Şuana kadar bir problemle karşılaşmadım.
Başka amaçlar için kullanılabildiğini tahmin ediyorum ama hiç araçtırmadım. Böyle bir belgeyi dört gözle beklerim.
Elimdeki kodunda mükemmel olmadığından eminim. Geliştirmek isterim.

Bilmediğin Neyse Yanıldığındır.

4

Re: Triggers & Stored Procedures kullanımı

kullanıcı logları icin , buda benden

Cetin hocam gene kızacak ama Public variable ı sadece username ve path bilgileri icin kullaniyorum smile



Visual Fox Pro
&& table designer table-triggers kısmında 

 
&&Insert Trigger icin : MyAudit("I")
&&Update Trigger icin : MyAudit("U")
&&Delete Trigger icin : MyAudit("D")
 
FUNCTION MyAudit(tcTriggerType)
LOCAL lnField, lcFieldName, lcTable, lcUserName, lcChanges
IF TYPE("m.gcKullanici") = "C" && kullanıcı public olarak declare edilmis olmali
    lcUserName = m.gcKullanici
ELSE
    lcUserName = "???"
ENDIF
lcTable = JUSTSTEM(DBF())
lcChanges = ""
 
DO CASE
 
CASE tcTriggerType = "D" &&delete
* nothing is required here, unless you want to
* save oldval(...) for each field
* (in case the user made changes, and then deleted the record)
 
CASE tcTriggerType = "I" &&insert
    FOR lnField = 1 TO FCOUNT()
        lcFieldName = FIELD(lnField)
        lcChanges = lcChanges + lcFieldName + ": ";
            + TRANSFORM(EVAL(lcFieldName));
            + CHR(13) + CHR(10)
    NEXT
 
CASE tcTriggerType = "U" &&update
    FOR lnField = 1 TO FCOUNT()
        lcFieldName = FIELD(lnField)
        lcChanges = lcChanges + lcFieldName + ": ";
            + TRANSFORM(OLDVAL(lcFieldName)) + " -> ";
            + TRANSFORM(EVAL(lcFieldName));
            + CHR(13) + CHR(10)
    NEXT
ENDCASE
 
IF NOT llExternalUpdate && runtime da ise kayit yarat harici islerde VFP ide vs...
    INSERT INTO MyAudit;
        (TableName, UserName, PcName,TrigType, WhenChang, CHANGES,DATE);
        VALUES;
        (lcTable, lcUserName, LapID(),tcTriggerType, DATETIME(), lcChanges,DATE())
ENDIF
 
ENDFUNC

5

Re: Triggers & Stored Procedures kullanımı

mrduyar yazdı:
Visual Fox Pro
*CREATE TABLE userlog (id i, terminal c(30),tarihsaat d,hareket c(1),tableismi c(20),kayitno n(10),aciklama c(50))

 
Procedure userekle
Local lalias,lrecno
lalias=Alias()
lrecno=Recno()
If Used("userlog")
    Select userlog
Else
    Use userlog In 0
Endif
Insert Into userlog (terminal,tarihsaat,hareket,tableismi,kayitno) Values (Alltrim(Sys(0)),Datetime(),'E',lalias,lrecno)
Return .T.
 
Procedure usersil
Local lalias,lrecno
lalias=Alias()
lrecno=Recno()
If Used("userlog")
    Select userlog
Else
    Use userlog In 0
Endif
Insert Into userlog (terminal,tarihsaat,hareket,tableismi,kayitno) Values (Alltrim(Sys(0)),Datetime(),'S',lalias,lrecno)
Return .T.
 
Procedure userduzelt
Local lalias,lrecno
lalias=Alias()
lrecno=Recno()
If Used("userlog")
    Select userlog
Else
    Use userlog In 0
Endif
Insert Into userlog (terminal,tarihsaat,hareket,tableismi,kayitno) Values (Alltrim(Sys(0)),Datetime(),'D',lalias,lrecno)
Return .T.

Ben sadece user log için kullanıyorum.
Şuana kadar bir problemle karşılaşmadım.
Başka amaçlar için kullanılabildiğini tahmin ediyorum ama hiç araçtırmadım. Böyle bir belgeyi dört gözle beklerim.
Elimdeki kodunda mükemmel olmadığından eminim. Geliştirmek isterim.


ben bir tek  kayıt no alani kullanmamisim buda iyi bir ayrıntı tabi...

6

Re: Triggers & Stored Procedures kullanımı

Tarkan ın daha önce adres etiket programının detaylarını anlatırken yazmis oldugu yazilarin html formatındaki halinide http://www.fox4um.com/downloads/triggers.zip linkinden indirip inceleyebilirsiniz

7

Re: Triggers & Stored Procedures kullanımı

Visual Fox Pro
Procedure usersil

Local lalias,lrecno
lalias=Alias()
lrecno=Recno()
If Used("userlog")
  Select userlog
Else
  Use userlog In 0
Endif
Insert Into userlog (terminal,tarihsaat,hareket,tableismi,kayitno) Values (Alltrim(Sys(0)),Datetime(),'S',lalias,lrecno)
Return .T.

tableda table/delete trigger alanına "usersil()" yazmama rağmen aktif olmuyor nasıl çöze bilirim.

Bilmediğin Neyse Yanıldığındır.

8

Re: Triggers & Stored Procedures kullanımı

benim ornege bakarsan sanırım daha anlasilir olacaktir

9 Son düzenleyen, mrduyar (17.10.2007 08:52:52)

Re: Triggers & Stored Procedures kullanımı

silme işi tamamdır.  ben görememişim.

Visual Fox Pro
Procedure userduzelt

    Local lalias,lrecno
    lalias=Alias()
    lrecno=Recno()
    If Used("userlog")
        Select userlog
    Else
        Use userlog In 0
    Endif
    Local lnfield,lcfieldname,lcchanges1
    lcchanges1 =""
    ** sadece değişenler içi aşağısı
    For lnfield = 1 To Fcount()
        lcfieldname = Field(lnfield)
        If Transform(Oldval(lcfieldname))<>Transform(Eval(lcfieldname))
            lcchanges1 = lcchanges1 + lcfieldname + ": ";
                + Transform(Oldval(lcfieldname)) + " -> ";
                + Transform(Eval(lcfieldname));
                + Chr(13) + Chr(10)
        Endif
    Next
    Insert Into userlog (terminal,tarihsaat,hareket,tableismi,kayitno) Values (Alltrim(Sys(0)),Datetime(),'D',lalias,lrecno)
    If Used("userlogd")
        Select userlogd
    Else
        Use userlogd In 0
    Endif
    Insert Into userlogd (userlogid,degisenler ) Values (userlog.Id,lcchanges1)
    Return .T.


amaç; soykan ın kodu ile kendi kodumu birleştirip sadece değişen alanları bilgilerini kayıt altına almak.

mecvut userlog.dbf 6 mb ve 100.000 kayıt mevcut. programda sadece 1 dbfin 1 yıllık  aylık kaydı. Bu bilgiler var elimde. Şimdi diğer (en az 20) dbf leride eklediğimde dosya fazlası ile şişecek diye düşünüyorum.

tüm porjedeki dosyalar için böyle bir log u memo alan ile birlikte tuttuğum başıma kötü şeyler gelebilir diye düşünüyorum.

gelelim soruya;
1. yukarıdaki yöntem(log için 2 dbf userlog ve userlogd) iyi böyle dursun.
2. userlog  a bir tane memo alan aç devam et.
3. userlog  a 10 tane c(50) alan aç memoya yazdıracaklarını onun içine yazdır.
4. hiçbiri birde bunu dene tongue (öneriniz)

Bilmediğin Neyse Yanıldığındır.

10

Re: Triggers & Stored Procedures kullanımı

aylik log tutabilirsin eger sisme konusunda endisen varsa acele oldu ama asagidaki gibi bir kodla
bunu otomatik olarak yapilmasini saglayabilirsin prg acilisinda

Visual Fox Pro
Local lcMonth,lcFile

If Day(Date())=1
    Do Case
        Case Month(Date())-1= 1
            m.lcMonth = [OCAK]
        Case Month(Date())-1= 2
            m.lcMonth = [SUBAT]
        Case Month(Date())-1= 3
            m.lcMonth = [MART]
        Case Month(Date())-1= 4
            m.lcMonth = [NISAN]
        Case Month(Date())-1= 5
            m.lcMonth = [MAYIS]
        Case Month(Date())-1= 6
            m.lcMonth = [HAZIRAN]
        Case Month(Date())-1= 7
            m.lcMonth = [TEMMUZ]
        Case Month(Date())-1= 8
            m.lcMonth = [AGUSTOS]
        Case Month(Date())-1= 9
            m.lcMonth = [EYLUL]
        Case Month(Date())-1= 10
            m.lcMonth = [EKIM]
        Case Month(Date())-1= 11
            m.lcMonth = [KASIM]
        Case Month(Date())-1= 12
            m.lcMonth = [ARALIK]
    Endcase
 
    m.lcFile = "LOG_" + m.lcMonth + "_" + Alltrim(Str(Year(Date()))) && LOG_EYLUL_2007
 
    Select userlog
    Copy To (m.lcFile) With Cdx
 
    Close Database All
    m.cFile = Fopen('userlog.DBF', 12)
    If (m.cFile > 0)   && dosya kullanimda degil
        Set Exclusive On
        Fclose(m.cFile)
        Use userlog
        Delete All
        Pack
        Set Exclusive Off
    Else
        &&dosya kullanimda
    Endif
Endif

11

Re: Triggers & Stored Procedures kullanımı

yöntem için teşkkürler.

Bilmediğin Neyse Yanıldığındır.