Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   C# Trigger Before Insert/Update wird nicht ausgeführt, wieso? (https://www.delphipraxis.net/104087-trigger-before-insert-update-wird-nicht-ausgefuehrt-wieso.html)

Jürgen Thomas 27. Nov 2007 10:12

Datenbank: Firebird • Version: 2.0 • Zugriff über: Firebird Net Provider

Trigger Before Insert/Update wird nicht ausgeführt, wieso?
 
Hallo,

ich habe in meiner Datenbank einen Trigger Before Insert and Update vorgemerkt:
SQL-Code:
begin
  if ( New.Id IS NULL)
  then New.Id = GEN_ID(Zebu_Aendg_ID, 1);
END
Die ID ist der PrimaryKey; der Trigger ist aktiv; der Generator existiert. Aber sowohl aus meinem Programm heraus als auch durch IBExpert scheitert der folgende Befehl mit der Fehlermeldung "Verletzung der Eindeutigkeit bei ID":
SQL-Code:
INSERT INTO Zebu_Aendg ( PLZ, St1Name, St1Kz)
     SELECT PLZ, ZBGName, ZBGKenn
       FROM Quelle_Zebu q
      WHERE ( Leitraum = :Leitraum )
          AND ( SELECT COUNT(*) FROM Zebu z WHERE q.Plz = z.Plz ) = 0;
Wenn ich den Generator direkt einbaue, funktioniert es:
SQL-Code:
INSERT INTO Zebu_Aendg ( ID, PLZ, St1Name, St1Kz)
     SELECT GEN_ID(ZEBU_AENDG_ID,1), PLZ, ZBGName, ZBGKenn
  /* usw. alles andere unverändert */
Was kann ich übersehen haben? (Eigentlich weiß ich genau genug, wie ich mit Generatoren und Triggern verfahren muss, aber hier...) Danke! Jürgen

mkinzler 27. Nov 2007 10:21

Re: Trigger Before Insert/Update wird nicht ausgeführt, wies
 
Ist der Trigger aktiv?
Ist ID wirklich NULL?

Jürgen Thomas 27. Nov 2007 12:22

Re: Trigger Before Insert/Update wird nicht ausgeführt, wies
 
Zitat:

Zitat von mkinzler
Ist der Trigger aktiv?

Ja; so wird es auch von IBExpert angezeigt.
Zitat:

Ist ID wirklich NULL?
Durch den INSERT-Befehl wurde ID nicht mit einem Wert belegt (siehe Code-Auszug). Also müsste es so gelten.

Aber diese Nachfrage bringt mich (vermutlich) auf die Lösung: Die ID ist definiert mit einer Domain:
SQL-Code:
CREATE DOMAIN D_ID AS INTEGER DEFAULT 0 NOT NULL
Dies hat FB wahrscheinlich zuerst ausgewertet. Ich werde deshalb den Trigger so ändern:
SQL-Code:
begin
  IF ( New.Id IS NULL OR New.Id = 0)
  THEN New.Id = GEN_ID(Zebu_Aendg_ID, 1);
END
Danke! Jürgen

PS. Dieses Problem war ein Beispiel für Betriebsblindheit: ich habe mich in meinen Gedanken festgerannt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz