Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Sqlite trigger
#1
Merhaba, araştırdım fakat bulamadım Sqlite TRIGGER özelliği var mı?


Bu kodları Firebird için kullanıyorum, Sqlite için modifiye edemedim 
 
Active := False;
      Close;
      SQL.Clear;
      SQL.Add(' CREATE TRIGGER HAVUZCONTROL FOR HAVUZ');
      SQL.Add(' ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 0');
      SQL.Add(' AS');
      SQL.Add(' BEGIN ');
      SQL.Add(' IF (INSERTING) THEN ');
      SQL.Add(' POST_EVENT ''INSERT''; ');
      SQL.Add(' ELSE ');
      SQL.Add(' IF (UPDATING) THEN ');
      SQL.Add(' POST_EVENT ''UPDATE''; ');
      SQL.Add(' ELSE ');
      SQL.Add(' POST_EVENT ''DELETE''; ');
      SQL.Add(' END ');
      ExecSQL;
Cevapla
#2
Aşağıdaki gibi deneyebilir misin?
Active := False;
Close;
SQL.Clear;
SQL.Add('CREATE TRIGGER IF NOT EXISTS HAVUZCONTROL AFTER INSERT OR UPDATE OR DELETE ON HAVUZ');
SQL.Add('BEGIN ');
SQL.Add('  SELECT CASE');
SQL.Add('    WHEN NEW._ROWID_ IS NOT NULL THEN');
SQL.Add('      RAISE(EVENT ''INSERT'', NEW._ROWID_)');
SQL.Add('    WHEN OLD._ROWID_ IS NOT NULL THEN');
SQL.Add('      RAISE(EVENT ''UPDATE'', OLD._ROWID_)');
SQL.Add('    ELSE');
SQL.Add('      RAISE(EVENT ''DELETE'')');
SQL.Add('  END;');
SQL.Add('END');
ExecSQL;
Begin : = end / 2;
Cevapla
#3
(28-03-2024, Saat: 16:37)RAD Coder Adlı Kullanıcıdan Alıntı: Aşağıdaki gibi deneyebilir misin?
Active := False;
Close;
SQL.Clear;
SQL.Add('CREATE TRIGGER IF NOT EXISTS HAVUZCONTROL AFTER INSERT OR UPDATE OR DELETE ON HAVUZ');
SQL.Add('BEGIN ');
SQL.Add('  SELECT CASE');
SQL.Add('    WHEN NEW._ROWID_ IS NOT NULL THEN');
SQL.Add('      RAISE(EVENT ''INSERT'', NEW._ROWID_)');
SQL.Add('    WHEN OLD._ROWID_ IS NOT NULL THEN');
SQL.Add('      RAISE(EVENT ''UPDATE'', OLD._ROWID_)');
SQL.Add('    ELSE');
SQL.Add('      RAISE(EVENT ''DELETE'')');
SQL.Add('  END;');
SQL.Add('END');
ExecSQL;


Hocam OR alanında hata verdi.

First chance exception at $00007FF8BEDF5B0C. Exception class ESQLiteNativeException with message '[FireDAC][Phys][SQLite] ERROR: near "OR": syntax error'. Process HAVUZLAR.exe (1360)
Cevapla
#4
Sanırım OR operatör desteği yok. 
Bu durumda her bir event için ayrı bir trigger ihtiycı olabilir.
Öncelikle tek bir even için yazın ve test edin. 
Başarılı olursa diğer event'ler içinde yazabilirsiniz. 

Yalnızca After Insert evet için Örnek:
Active := False;
Close;
SQL.Clear;
SQL.Add('CREATE TRIGGER IF NOT EXISTS HAVUZCONTROL_INSERT AFTER INSERT ON HAVUZ');
SQL.Add('BEGIN ');
SQL.Add('  SELECT CASE');
SQL.Add('    WHEN NEW._ROWID_ IS NOT NULL THEN');
SQL.Add('      RAISE(EVENT ''INSERT'', NEW._ROWID_)');
SQL.Add('  END;');
SQL.Add('END');
ExecSQL;
Begin : = end / 2;
Cevapla
#5
Sqlite Create Trigger

.
Cevapla
#6
(28-03-2024, Saat: 16:54)RAD Coder Adlı Kullanıcıdan Alıntı: Sanırım OR operatör desteği yok. 
Bu durumda her bir event için ayrı bir trigger ihtiycı olabilir.
Öncelikle tek bir even için yazın ve test edin. 
Başarılı olursa diğer event'ler içinde yazabilirsiniz. 

Yalnızca After Insert evet için Örnek:
Active := False;
Close;
SQL.Clear;
SQL.Add('CREATE TRIGGER IF NOT EXISTS HAVUZCONTROL_INSERT AFTER INSERT ON HAVUZ');
SQL.Add('BEGIN ');
SQL.Add('  SELECT CASE');
SQL.Add('    WHEN NEW._ROWID_ IS NOT NULL THEN');
SQL.Add('      RAISE(EVENT ''INSERT'', NEW._ROWID_)');
SQL.Add('  END;');
SQL.Add('END');
ExecSQL;


Sqlite ne kadar gıcık bir db. Hocam kusura bakmayın şimdide EVENT alanında hata veriyor. 
birçok değişiklik yaptım ama başarılı olmadı.

Exception class ESQLiteNativeException with message '[FireDAC][Phys][SQLite] ERROR: near "EVENT": syntax error'.
Cevapla
#7
Öncelikle Trigger oluşturalım ve trigger'ın çalıştığından emin olalım. 
Bunun için bir temp tablo oluşturun ve trigger kodunda, bu tabloya aşağıdaki gibi bir insert yapın. 
Bunun için aşağıdaki gibi deneyebilir misiniz. 
SQL.Clear;
SQL.Add('CREATE TRIGGER IF NOT EXISTS HAVUZCONTROL_INSERT AFTER INSERT ON HAVUZ');
SQL.Add('BEGIN ');
SQL.Add('  INSERT INTO FARKLI_BIR_TABLO (FARKLI_BIR_TABLO_ALANI) VALUES (''Trigger çalıştı ve yeni kayıt eklendi.'');');
SQL.Add('END');
ExecSQL;
Begin : = end / 2;
Cevapla
#8
(29-03-2024, Saat: 09:11)RAD Coder Adlı Kullanıcıdan Alıntı: Öncelikle Trigger oluşturalım ve trigger'ın çalıştığından emin olalım. 
Bunun için bir temp tablo oluşturun ve trigger kodunda, bu tabloya aşağıdaki gibi bir insert yapın. 
Bunun için aşağıdaki gibi deneyebilir misiniz. 
SQL.Clear;
SQL.Add('CREATE TRIGGER IF NOT EXISTS HAVUZCONTROL_INSERT AFTER INSERT ON HAVUZ');
SQL.Add('BEGIN ');
SQL.Add('  INSERT INTO FARKLI_BIR_TABLO (FARKLI_BIR_TABLO_ALANI) VALUES (''Trigger çalıştı ve yeni kayıt eklendi.'');');
SQL.Add('END');
ExecSQL;


Harika bu şekilde çalıştı Üstat, POST_EVENT yakalarsam daha iyi olacak
Cevapla
#9
(29-03-2024, Saat: 11:29)Nedim Adlı Kullanıcıdan Alıntı:
(29-03-2024, Saat: 09:11)RAD Coder Adlı Kullanıcıdan Alıntı: Öncelikle Trigger oluşturalım ve trigger'ın çalıştığından emin olalım. 
Bunun için bir temp tablo oluşturun ve trigger kodunda, bu tabloya aşağıdaki gibi bir insert yapın. 
Bunun için aşağıdaki gibi deneyebilir misiniz. 
SQL.Clear;
SQL.Add('CREATE TRIGGER IF NOT EXISTS HAVUZCONTROL_INSERT AFTER INSERT ON HAVUZ');
SQL.Add('BEGIN ');
SQL.Add('  INSERT INTO FARKLI_BIR_TABLO (FARKLI_BIR_TABLO_ALANI) VALUES (''Trigger çalıştı ve yeni kayıt eklendi.'');');
SQL.Add('END');
ExecSQL;


Harika bu şekilde çalıştı Üstat, POST_EVENT yakalarsam daha iyi olacak

SQLite veri tabanında DB Event yok diye biliyorum.
Benzer işlemleri trigger ile (AFTER/BEFORE INSERT, UPDATE, DELETE) yapmaya çalışın.
Begin : = end / 2;
Cevapla
#10
(29-03-2024, Saat: 11:38)RAD Coder Adlı Kullanıcıdan Alıntı:
(29-03-2024, Saat: 11:29)Nedim Adlı Kullanıcıdan Alıntı: Harika bu şekilde çalıştı Üstat, POST_EVENT yakalarsam daha iyi olacak

SQLite veri tabanında DB Event yok diye biliyorum.
Benzer işlemleri trigger ile (AFTER/BEFORE INSERT, UPDATE, DELETE) yapmaya çalışın.


Üstat bu şekilde inserti yakaladım. 

Aynı anda delete ve update içinde bir çözüm bulursam iyi olacak.
Saygılarımla.

    With FDQuery do
    begin
      Connection := FDConnection;
      Active := False;
      Close;
      SQL.Clear;
      SQL.Add('DROP TRIGGER IF EXISTS intEv;');
      SQL.Add('CREATE TRIGGER IF NOT EXISTS intEv');
      SQL.Add('AFTER INSERT ON HAVUZ');
      SQL.Add('BEGIN');
      SQL.Add('SELECT POST_EVENT(''INSERT'');');
      SQL.Add('END;');
      ExecSQL;
    end;
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Trigger Enable / Disable Yapmak OZCANK 14 9.458 10-06-2023, Saat: 20:32
Son Yorum: ermanispir@gmail.com
  Tarih Guncelleme Trigger OZCANK 2 997 24-05-2023, Saat: 17:06
Son Yorum: OZCANK
  SQLite Runtime Connection Sorunu (ÇÖZÜLDÜ) recepmut@hotmail.com 7 3.591 08-05-2021, Saat: 22:22
Son Yorum: shooterman
  SQLite Veritabanı Güncelleme Frrst 5 3.035 26-10-2020, Saat: 18:53
Son Yorum: Frrst
  SQLite Text Alanı Sorunu Frrst 8 3.572 17-10-2020, Saat: 19:47
Son Yorum: Frrst



Konuyu Okuyanlar: 1 Ziyaretçi