begin
/* Trigger text */
new.toplam=new.tekrar*new.birim_zaman*new.adam*new.tekrar_sayisi;
old.toplam=old.tekrar*old.birim_zaman*old.adam*old.tekrar_sayisi;
if (inserting) then
begin
if (new.toplam is null ) then new.toplam=0;
update gruplar set gruplar.toplam = gruplar.toplam+new.toplam where gruplar.id=new.grup_id;
end
if (updating) then
begin
if (new.toplam is null ) then new.toplam=0;
if (old.toplam is null ) then old.toplam=0;
update gruplar set gruplar.toplam = gruplar.toplam+new.toplam-old.toplam where gruplar.id=new.grup_id;
end
if (deleting) then
begin
if (new.toplam is null ) then new.toplam=0;
if (old.toplam is null ) then old.toplam=0;
update gruplar set gruplar.toplam = gruplar.toplam-old.toplam where gruplar.id=old.grup_id;
delete from gorevler_data where gorevler_data.gorev_id=old.id;
end
end
Böyle bir trgigerim var ama silme yaparken aşağıdaki gibi hata alıyorum triggeri iptal edersem çalışması sıkınıt yok..
Error Message:
----------------------------------------
The cursor identified in the update or delete statement is not positioned on a row.
no current record for fetch operation.
attempted update of read-only column.
if (inserting or updating ) then
begin
new.toplam=new.tekrar*new.birim_zaman*new.adam*new.tekrar_sayisi;
if (new.toplam is null ) then new.toplam=0;
toplam=toplam+new.toplam;
end
if (updating or deleting ) then
begin
old.toplam=old.tekrar*old.birim_zaman*old.adam*old.tekrar_sayisi;
toplam = toplam - old.toplam;
delete from gorevler_data where gorevler_data.gorev_id=old.id;
end
update gruplar set gruplar.toplam = gruplar.toplam +:toplam where gruplar.id=old.grup_id;
kodu biraz sadeleştirirken hatamı buldum old.* insert triggerinde olmadığı için if (inserting) üstünde atama yaptığımdan hata veriyormuş galiba şimdi hata vermiyor.
Her yiğidin yoğurt yiyişi farklıdır. Bence INSERT UPDATE veya DELETE için ayrı ayrı Trigger yazmak, hem kod sadeliği açısından hem de hız açısından önem arz eder. Siz Trigger'ınızda IF INSERTING OR UPDATING gibi ifadeleri defalarca kullanıp Procedure'u dallandırıyorsunuz. Bu her bir kayıt silme, düzeltme ve ekleme işlemi sırasında çalışacak. Boşuna CPU Cycle'larından yersiniz. Size böyle bir imkan verilmiş, INSERT aşamasında ne yapmak istiyorsanız INSERT triggerına , UPDATE sırasında yapılması istenenler UPDATE triggerina yazılarak, boşuna CPU'dan yemeyin. Hem de kod karmaşasından kurtulun. Insert işi yaparken sadece INSERT triggerını tetikletmiş olursunuz. UPDATE ve DELETE bölümleri hiç devreye girmez. Böylelikle de Hız kazanırsınız.
Kolay Gelsin
Performans işlemleri için bu tür küçük ama önemli ayrıntıları gözden kaçırmayın.