Firebird Trigger

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
cetoonak
Üye
Mesajlar: 50
Kayıt: 12 Haz 2003 09:53
Konum: www.mussimsek.com

Firebird Trigger

Mesaj gönderen cetoonak »

Merhaba

Kod: Tümünü seç

CREATE TRIGGER GIRIS_AI0 FOR GIRIS
ACTIVE AFTER INSERT POSITION 0
AS

  DECLARE VARIABLE MALZEME_ID INT;
  DECLARE VARIABLE MALZEME VARCHAR(100);
  DECLARE VARIABLE GRUP VARCHAR(100);

begin

  SELECT
    NEW.MALZEME_ID,
    MALZEME.MALZEME,
    GRUP.GRUP
  FROM
    NEW
    LEFT OUTER JOIN MALZEME ON NEW.MALZEME_ID = MALZEME.ID
    LEFT OUTER JOIN GRUP ON MALZEME.GRUP_ID = GRUP.ID
  INTO
    :MALZEME_ID, :MALZEME, :GRUP;

end

Bu kodu çalıştırdığımda verdiği hata:

Kod: Tümünü seç

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Table unknown.
NEW.
At line 35, column 5.
Buna benzer bir kod SQL Serverda kullanmıştım.
Firebirdde neden olmuyor acaba ?
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

from un altındaki new tablo adını beğenmedi. new reserverd word olduğundan olabilir :idea: Tablo adını değiştir..
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
cetoonak
Üye
Mesajlar: 50
Kayıt: 12 Haz 2003 09:53
Konum: www.mussimsek.com

Mesaj gönderen cetoonak »

Ama ben değişkenlerin değerlerini NEW den almak istiyorum.
Bildiğim kadarıyla Firebird yeni eklenen kaydı NEW, onun eklenmeden önceki halini de OLD isimli bir tabloda tutuyor.
Yani SQL Servede böyle olduğu için Firebirdde de böyledir diye düşündüm.
SQL Serverda NEW yerine INSERTED OLD yerine DELETED var.
Dolayısıyla NEW isimli tabloyu benim normal bir tabloyu kullanır gibi kullanabilmem gerekmiyor mu ?
Dediğim gibi bu kodun SQL Server versiyonunu kullanmıştım.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

iyi de from un altında başıboş duran bir NEW var :!:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
cetoonak
Üye
Mesajlar: 50
Kayıt: 12 Haz 2003 09:53
Konum: www.mussimsek.com

Mesaj gönderen cetoonak »

Hocam başıboş durmuyor altında joinler var.
O benim syntax kullanımımdan kaynaklı olabilir.

SQL Serverda ona çok benzer bir yapı kullanmıştım:

Kod: Tümünü seç

CREATE TRIGGER EkleMalzeme ON Malzeme
FOR INSERT
AS

DECLARE @Malzeme VARCHAR(200)
DECLARE @Miktar FLOAT
DECLARE @Birim VARCHAR(20)

SELECT
  @Malzeme = Malzeme,
  @Miktar = Miktar,
  @Birim = Birim
FROM
  Inserted
  LEFT OUTER JOIN Onay ON Inserted.OnayId = Onay.Id
Burda da "Inserted" kelimesi başı boş sizin matığınıza göre ama bu kod çalışıyor.
snofru
Üye
Mesajlar: 204
Kayıt: 19 Ağu 2004 02:57
Konum: /local/usr/src
İletişim:

Mesaj gönderen snofru »

@cetoonak DB'ler arası bu tip ayrımlar olabilir, normaldir. Ancak anlamadığım From dan sonraki Tablo ismin sabit değil mi? Niçin yazıp keyfine bakmıyorsun...

Kolay gelsin...
cetoonak
Üye
Mesajlar: 50
Kayıt: 12 Haz 2003 09:53
Konum: www.mussimsek.com

Mesaj gönderen cetoonak »

Tablo ismim "GIRIS" fakat orda NEW yerine "GIRIS" yazarsam en son tetiklenen kayıt üzerinde işlem yapmam için ayrıca kodlar yazmam gerkemez mi ?.
Ben SQL Server ile Firebird ü karşılaştırmıyorum.
SQL Serverdaki mantığı biliyorum.
Firebirddekini çözmeye çalışıyorum.
Bir örnek üzerinde anlatayım:
Basit stok mantığıyla düşünürsek GIRIS tablosuna kayıt eklendiğinde DEPO tablosundaki ilgili kayıttaki MIKTAR artacak, öyle bir kayıt yoksa da eklenecek.
Kayıt eklenirken DEPO tablosunda diyelim MALZEME, MIKTAR VE GRUP isimli 3 field var.
GIRIS tablosunda MALZEME, MIKTAR var fakat GRUP yok.
O da başka bir tabloda.
Dolayısıyla DEPO tablosuna otomatik olarak kayıt eklenirken MALZEME ve MIKTAR alanlarını NEW den GRUP u da MALZEME_GRUBU tablosundan alması için JOIN yapmamız gerekmiyor mu ?
Yoksa onu ayrı bir işlemde mi yapmalıyım ?
cetoonak
Üye
Mesajlar: 50
Kayıt: 12 Haz 2003 09:53
Konum: www.mussimsek.com

Mesaj gönderen cetoonak »

Neyse anladığım kadarıyla Firebirde "FROM NEW" diye bir yapı yok
Ben SQL Serverda bu şekilde kullandığım için burda da öyledir diye düşünmüştüm.
Başka bir şekilde hallettim.
İlgilenen herkese teşekkürler.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Firebird de NEW veya OLD şeklinde bir tablo tutulmaz. Bu değerleri NEW.BilmemneAlanı, OLD.BilmemneAlanı şeklinde kullanırsın.

O yüzden de FROM NEW gibi bir komut kabul edilmez. Trigger lar zaten belirttiğin tabloya bağımlıdır.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

cetoonak yazdı:Neyse anladığım kadarıyla Firebirde "FROM NEW" diye bir yapı yok...
Syntax yani yazım farkı muhakkak ki veritabanından veritabanına değişecektir. O yüzden daha önce kullanılan veritabanı yazımına göre yazmadan o veritabanına has yazım formatlarını araştırmakta fayda vardır :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla