AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Problem mit Trigger Firebird 1.5
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Trigger Firebird 1.5

Ein Thema von derzwent · begonnen am 24. Jan 2006 · letzter Beitrag vom 24. Jan 2006
Antwort Antwort
derzwent

Registriert seit: 8. Apr 2005
Ort: Beierfeld
10 Beiträge
 
#1

Problem mit Trigger Firebird 1.5

  Alt 24. Jan 2006, 06:47
Datenbank: Firebird • Version: 1.5 • Zugriff über: ZEOS
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Problem mit Trigger Firebird 1.5

  Alt 24. Jan 2006, 08:00
Wie sieht der Kopf des Triggers aus? Der Rumpf scheint OK zu sein.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#3

Re: Problem mit Trigger Firebird 1.5

  Alt 24. Jan 2006, 08:15
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...
Gruß, Jan
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Problem mit Trigger Firebird 1.5

  Alt 24. Jan 2006, 08:23
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 set generator gen_dvd_id to <Wert>
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Problem mit Trigger Firebird 1.5

  Alt 24. Jan 2006, 08:49
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
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#6

Re: Problem mit Trigger Firebird 1.5

  Alt 24. Jan 2006, 10:19
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.
Gruß, Jan
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Problem mit Trigger Firebird 1.5

  Alt 24. Jan 2006, 10:49
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.

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 ; ^
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:05 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