![]() |
Datenbank: embedded Firebird • Version: 1.5.2.4731 • Zugriff über: ZEOS
[Firebird] Trigger/Generatoren anlegen
Moin DP!
Ich möchte jetzt in ner FireBird-DB ein AutoInc realisieren. Ich hab mittlerweile rausbekommen, das ich dafür nen Trigger und nen Generator brauche. Habe hier auch bereits einen Code-Schnipsel für nen Trigger gefunden, den ich mir angepasst habe:
SQL-Code:
Meine Frage ist jetzt: Kann ich das einfach über ne Query als SQL-Befehl hinschicken? Und vor allem, wann muss ich das machen? Kommt das mit beim Create Table-Befehl? Oder nachdem die Tabelle angelegt ist, oder ist das egal? Dann müsste ich mich halt nur noch informieren, wie mein Generator auszusehen hat.
CREATE TRIGGER "Debitoren_BI0" FOR "Debitoren"
ACTIVE BEFORE INSERT POSITION 0 as begin if (new.LfdNr = 0) then new.LfdNr = lfdNr_id(Debitoren, 1); end DAnke im Voraus, |
Re: [Firebird] Trigger/Generatoren anlegen
Die Reihenfolge der einzelnen Statements:
Delphi-Quellcode:
...nur mal so als Beispiel.
Erst die Tabelle:
CREATE TABLE TEST ( IDFILED INTEGER ) danach der Generator: CREATE GENERATOR TEST_IDFILED_GEN und dann der Trigger: CREATE TRIGGER AI_TEST_IDFILED FOR TEST ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.IDFILED IS NULL) THEN NEW.IDFILED = GEN_ID(TEST_IDFILED_GEN, 1); END |
Re: [Firebird] Trigger/Generatoren anlegen
Zitat:
SQL-Code:
CREATE TRIGGER "Debitoren_BI0" FOR "Debitoren"
ACTIVE BEFORE INSERT POSITION 0 as begin if (new.LfdNr is null or new.LfdNr = 0) then new.LfdNr = gen_id(lfdNr_id, 1); end Zitat:
Zitat:
SQL-Code:
angelegt.
create generator <name_of_generator>
Gruß, Marcel |
Re: [Firebird] Trigger/Generatoren anlegen
Hallo,
zuerst erzeuge deine Tabelle und den Generator, dann den Trigger. Bei der Anpassung des gefundenen SQL-Codes ist dir vielleicht nicht klar gewesen, dass du gen_id() nicht einfach umbenennen kannst. Es handelt sich dabei um eine Funktion, der erste Parameter ist der Name des Generators und nicht der Tabelle. Schau nochmal hier: ![]() Das sind alles DDL Statements, die in der Regel nichts mit deiner Anwendung zu tun haben. Sie werden beim Aufsetzen der Datenbank ausgeführt. Wenn das von deinem Programm miterledigt wird, dann bitte in einem abgeschotteten Programmzweig. Du könntest sowas mit ZQuery erledigen, besser finde ich ein DDL-Script. Oder mache es mit einer SQl-Konsole und installiere im Setup später eine Leerdatenbank, die schon alles enthält. Grüße vom marabu |
Re: [Firebird] Trigger/Generatoren anlegen
Man kann die gen_id() auch über eine SP abrufen, einfügen und gleich an das aufrufende Programm zurückgeben. Ist m.E. der bessere Weg, da man die aktuelle ID gleich im Programm benutzen kann, ohne die Daten neu einlesen zu müssen.
|
Re: [Firebird] Trigger/Generatoren anlegen
Anscheinend will er das aber mit einem TQuery machen, aus Delphi raus ! Die Table mitsamt Generator/Trigger lege ich aber mit IBExpert in 1 Min. an. Für den Trigger wird ein Grundgerüst angelegt, ähnlich wie in Delphi. Das wird angepaßt und das wars schon.
|
Re: [Firebird] Trigger/Generatoren anlegen
Wow, da ist man ne halbe Stunde bei nem Kunden und denkt sich, vielleicht hat ja schon einer geantwortet. Und man hat gleich vier Antworten :thumb: Danke für eure Mühe!
@marabu und Marcel Danke für die Fehlerberichtigung. DAs Gebiet ist halt noch ziemliches Neuland für mich (Einzige "SQL"-Kenntnisse aus der 11. Klasse mit MS Access *grusel*) @marcel Sollte schon alles vom Programm erledigt werden. Hauptsächlich aus dem Grund, um es endlich mal zu lernen :wink: @tom70 Das mit der SP werd ich mir mal anschauen, noch brauch ich die LfdNr nicht, aber wer weiß, was kommt :!: @hansa Genau, ich wollte keinen Designer verwenden. Kann man SPs nicht zur Laufzeit anlegen? |
Re: [Firebird] Trigger/Generatoren anlegen
Mit einer SP könnte dasso aussehen:
Delphi-Quellcode:
CREATE PROCEDURE TEST_INSERT (
TEXT VARCHAR (10)) RETURNS (ID INTEGER) AS BEGIN -- ID von Generator holen ID = GEN_ID(TEST_ID_GEN, 1); -- Daten einfügen INSERT INTO TEST ( ID, TEXT) VALUES ( :ID, :TEXT); SUSPEND; END |
Re: [Firebird] Trigger/Generatoren anlegen
Zitat:
Läßt sich die DB zumindest für eine vorhersehbare Zeit planen, dann ist der Laufzeitweg ein Irrweg, weil es genügend Hilfsmittel gibt, die einem die Arbeit erleichtern. Also beser Rad nicht neu erfinden und die DB möglichst vorausschauend planen ! Wenn ich mir vorstelle meine DB mit einem Delphi-Programm verwalten zu müssen, dann wird mir ganz schlecht. :mrgreen: P.S.: zur Laufzeit und SPs : hat jetzt mit Trigger usw. nicht viel zu tun, aber da kann man Parameter definieren, die erst zur Laufzeit mit konkreten Werten bestückt werden. |
Re: [Firebird] Trigger/Generatoren anlegen
Zitat:
Aber ernsthaft: Die Struktur wird sich kaum ändern, da das ganze Programm nicht sonderlich umfangreich wird. Mir gings mehr um den Lerneffekt. Aber vielleicht sollte ich wirklich mal überlegen, ob der Lerneffekt darin liegt, auch mal nen Designer zu verwenden... :-D Btw. kennt da jemand einen guten Freeware-Designer für Firebird-DBs, die nicht übern Server anzusprechen sind (embedded Firebird, halt) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:29 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-2025 by Thomas Breitkreuz