Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit Trigger Firebird 1.5 (https://www.delphipraxis.net/61624-problem-mit-trigger-firebird-1-5-a.html)

derzwent 24. Jan 2006 05:47

Datenbank: Firebird • Version: 1.5 • Zugriff über: ZEOS

Problem mit Trigger Firebird 1.5
 
Guten Morgen an alle,

Habe gestern schonmal gepostet, nun aber einen Tipp bekommen daß mit dem trigger etwas nicht stimmt.

Delphi-Quellcode:
AS
BEGIN
  IF (NEW.NUMMER IS null) THEN
    NEW.NUMMER = GEN_ID(gen_dvd_id,1);
END
Also nochmal zum Problem:

Das Feld Nummer soll mittels Autoincrement hochzählen begonnen von Datensatz 1. Das macht er aber leider nicht, sondern bricht mit einer Fehlermeldung ab (hab ich gestern beschrieben).
Einstellungen der Firebird Datenbank: Nummer; not null; default source 1; autoincrement; integer.

Hoffe das hier der Fehler liegt, da ich absolut nicht weiter weiß.

Danke schonmal.

Sven

mkinzler 24. Jan 2006 07:00

Re: Problem mit Trigger Firebird 1.5
 
Wie sieht der Kopf des Triggers aus? Der Rumpf scheint OK zu sein.

Der Jan 24. Jan 2006 07:15

Re: Problem mit Trigger Firebird 1.5
 
Wenn die Fehlermeldung noch die selbe ist, hast du doch die Antwort schon bekommen. Es liegt eine Verletzung bei Primär- oder anderen eindeutigen Schlüsselwerten vor. Erhöhe manuell den Geneartorwert.
Sowas passiert auf, wenn man manuell im Admin-Tool (z.B. IBExpert) ein paar Daten einfügt und der Generatorwert nicht geändert wird. Fügt man dann vom Programm aus Daten ein. Zack, Fehler...
Prüf das mal. Könnte schon die Lösung sein...

mkinzler 24. Jan 2006 07:23

Re: Problem mit Trigger Firebird 1.5
 
Ach imnmer moch das selbe Problem! Vergleiche mal den höchsten Wert der vorhandenen Datensätze mit dem Wert des Generators. der Wert des Generators darf nicht kleiner sein als die höchste bereits vergebene ID. Wenn das der Fall sein sollte Generator manuell erhöhen mit Toll (z.B. IBExpert) oder mit
SQL-Code:
set generator gen_dvd_id to <Wert>

dataspider 24. Jan 2006 07:49

Re: Problem mit Trigger Firebird 1.5
 
Hi,

wenn du das Feld auf default 1 eingestellt hast, kann der Trigger doch keinen Wert erzeugen, da das Feld nummer ja nicht null, sonder 1 ist, oder liege ich da falsch?

Cu, Frank

Der Jan 24. Jan 2006 09:19

Re: Problem mit Trigger Firebird 1.5
 
Zitat:

Zitat von dataspider
Hi,

wenn du das Feld auf default 1 eingestellt hast, kann der Trigger doch keinen Wert erzeugen, da das Feld nummer ja nicht null, sonder 1 ist, oder liege ich da falsch?

Cu, Frank

Das könnte es theoretisch schon sein. Nur weiß ich jetzt nicht, wann der Default-Wert gesetzt wird. Das passiert ja IMHO auch in nem Trigger (allerdings versteckt), der wird aber glaub ich erst nach allen anderen aufgerufen.

Hansa 24. Jan 2006 09:49

Re: Problem mit Trigger Firebird 1.5
 
Der default Wert wird nur genommen, wenn das Feld NULL ist ! 1. Fehler : wird es manuell besetzt, dann wird es nie NULL sein und der Trigger schlägt nicht zu. 2. Fehler : es wird von alleine auch nicht 1, weil DEFAULT eben nur greift bei NULL. Tja, so beißt sich normalerweise nur eine Katze in den Schwanz. :mrgreen:

So legt man sich übrigens eine IB/FB-Datenbank inkl. "Autoincrement" in 2 Min. an :

SQL-Code:
/******************************************************************************/
/****         Generated by IBExpert 2005.09.25 24.01.2006 11:03:51         ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES ISO8859_1;

CREATE DATABASE 'C:\db\TESTDB.FDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 4096
DEFAULT CHARACTER SET ISO8859_1;



/******************************************************************************/
/****                              Generators                             ****/
/******************************************************************************/

CREATE GENERATOR SHOP_GEN_ID;
SET GENERATOR SHOP_GEN_ID TO 2; <-- Generatorwert steht hier bei 2 ! Warum ?
                                    Es wurden 2 Datensätze angelegt und der Trigger
                                    hat die ID bereits 2 mal erhöht.  

/******************************************************************************/
/****                                Tables                               ****/
/******************************************************************************/

CREATE TABLE SHOP (
    ID   INTEGER NOT NULL,
    NR   INTEGER,
    NAME CHAR(30)
);


INSERT INTO SHOP (ID, NR, NAME) VALUES (1, 1, 'name                         ');
INSERT INTO SHOP (ID, NR, NAME) VALUES (2, 2, 'name2                         ');
                  ^                     ^  wurde vom Trigger besetzt
COMMIT WORK;



/******************************************************************************/
/****                             Primary Keys                            ****/
/******************************************************************************/

ALTER TABLE SHOP ADD CONSTRAINT PK_SHOP PRIMARY KEY (ID);

/******************************************************************************/
/****                               Triggers                              ****/
/******************************************************************************/

SET TERM ^ ;

/******************************************************************************/
/****                         Triggers for tables                         ****/
/******************************************************************************/

/* Trigger: SHOP_BI0 */
CREATE TRIGGER SHOP_BI0 FOR SHOP
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.ID is null) then
    new.ID = gen_id(SHOP_GEN_ID, 1);
end
^

SET TERM ; ^


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 Uhr.

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