Triger ile sıra no verme

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
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Triger ile sıra no verme

Mesaj gönderen haydarxxx »

Sy undefined Moderator hocamın forumda vermiş olduğu bir triger var bu kayıtlara SIRA_NO veriyor.Konu farklı olduğu için yeni bir başlık açtım bu yüzden

Kod: Tümünü seç


CREATE TRIGGER TBL_PERSONEL_SIRA FOR TBL_PERSONEL
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE MAXSIRA INTEGER; 
begin 
  if (NEW.SIRA_NO IS NULL) then
  BEGIN 
     SELECT coalesce(MAX(SIRA_NO),0)+1 FROM TBL_PERSONEL  INTO NEW.SIRA_NO;
   END 
burada SIRA_NO 1,2,3,4,5,6,7.... verdiği sıra numarasından örneğin 4. kayıdı sildiğimizde 1,2,3,5,6,7....şeklinde kalıyor.

Triger i delete posıtıonda ayarlama çalışıyorum yani silme işlemi olduğunda kayıtdı düzenleyerek 1,2,3,4,5,6.... şeklinde devam etmesini istiyorum ve şöyle bir şey denedim olmadı

Kod: Tümünü seç


CREATE TRIGGER TBL_PERSONEL_SIRA FOR TBL_PERSONEL
ACTIVE BEFORE DELETE POSITION 0
AS
DECLARE VARIABLE MAXSIRA INTEGER; 
begin 
  if (NEW.SIRA_NO IS NULL) then
  BEGIN 
     SELECT coalesce(MAX(SIRA_NO),0)-1 FROM TBL_PERSONEL  INTO NEW.SIRA_NO;
   END 

Kod: Tümünü seç

Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
NEW.SIRA_NO.
At line 6, column 11.

NEW.SIRA_NO da hata alıyorum.NEW yerine ne gelmeli yada bu triger nasıl yazılır.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
sanırım sorunun muhatabı değilim ama yinede cevap vereyim.
delete trigerinde new yoktur. onun yerine old kullanabilirsin.
ancak istediğin şeyi elde etmek için izlediğin yol bana pek makul gelmedi.
kayıt silindiği zaman şöyle bir kod çalıştırmalısın.

Kod: Tümünü seç

//tetikleyiciye silinen kaydın sıranumarasının bir altını ver 
set generator xxx to old.sirano-1 //gibi bişey
sonra tabloda update yap.
update tablo set
sirano =gen_id(genxxxxx,1)
where sirano>old.sirano
mantık olarak böyle bişey senin işini görmesi lazım.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

Mantığınız hatalı. Sıra öyle kalsın bir sorun olmaz. Veritabanında bu tarz bir işlem yapmanız yanlış + başınıza çok dert çıkartır.

Kolay gelsin.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Sıra No'yu nerede kullanıyorsunuz?

ID'ler master-detail tablolar arasında ilişki kurmaya yararlar. Eğer siz bu numara ile iki tablo arasında ilişki kuruyorsanız, numaraları değiştirmeniz ile master-detail arasındaki numaraya göre tutulan ilişki kopacaktır.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Hiç elleme bırak dağınık kalsın :wink: Yoksa gereksiz bir enerji ve emek kaybı olur. İlle de sıra ile gitsin istiyorsan Insert te kullanılan en son sıra numarasının bir büyüğü yerine kullanılmayan ilk boş kayıtı ver diyebilirsin. Bunun için de trigger içinde epey bir kod yazman gerekecek :roll:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

İlla bu işi yapacağım diyorsanız şuna benzer bir trigger işinizi görebilir:

Kod: Tümünü seç

CREATE TRIGGER KZBL_AFTER_DELETE FOR KZBL
ACTIVE AFTER DELETE POSITION 0 AS
BEGIN
  UPDATE KZBL SET SIRA_NO = SIRA_NO - 1
  WHERE SIRA_NO > Old.SIRA_NO
  ORDER BY SIRA_NO;
END;
İyi çalışmalar.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Cevaplayan herkeze çok teşekkür ediyorum.Ben triger ile yapılan kayıtlara sıra numarasını verdirirken aynı işte silme durumunda kaydı triger sıra numarasını doğru tutturabilirmiyim diye aramıştım ama çok önemli değil.Hocalarımın dediği gibi fazladan yük olacak bir iş zaten onların tavsiyesine uyorum ben de o zaman :D .Tekrar sağolun
Cevapla