Delphi Can
Sqlite trigger - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: Sqlite trigger (/showthread.php?tid=7664)

Sayfalar: 1 2


Sqlite trigger - Nedim - 28-03-2024

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;



Cvp: Sqlite trigger - RAD Coder - 28-03-2024

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;



Cvp: Sqlite trigger - Nedim - 28-03-2024

(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)


Cvp: Sqlite trigger - RAD Coder - 28-03-2024

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 trigger - anemos - 28-03-2024

Sqlite Create Trigger

.


Cvp: Sqlite trigger - Nedim - 28-03-2024

(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'.


Cvp: Sqlite trigger - RAD Coder - 29-03-2024

Ö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;



Cvp: Sqlite trigger - Nedim - 29-03-2024

(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


Cvp: Sqlite trigger - RAD Coder - 29-03-2024

(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.


Cvp: Sqlite trigger - Nedim - 29-03-2024

(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;