AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi [Firebird] Trigger/Generatoren anlegen
Thema durchsuchen
Ansicht
Themen-Optionen

[Firebird] Trigger/Generatoren anlegen

Ein Thema von Thanatos81 · begonnen am 25. Aug 2005 · letzter Beitrag vom 25. Aug 2005
Antwort Antwort
Seite 1 von 2  1 2      
Thanatos81
(Gast)

n/a Beiträge
 
#1

[Firebird] Trigger/Generatoren anlegen

  Alt 25. Aug 2005, 10:26
Datenbank: embedded Firebird • Version: 1.5.2.4731 • Zugriff über: ZEOS
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:
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
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.

DAnke im Voraus,
  Mit Zitat antworten Zitat
Tom70

Registriert seit: 11. Mär 2005
33 Beiträge
 
#2

Re: [Firebird] Trigger/Generatoren anlegen

  Alt 25. Aug 2005, 10:55
Die Reihenfolge der einzelnen Statements:

Delphi-Quellcode:
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
...nur mal so als Beispiel.
  Mit Zitat antworten Zitat
Benutzerbild von Marcel Gascoyne
Marcel Gascoyne

Registriert seit: 18. Nov 2003
Ort: Uetersen
271 Beiträge
 
Delphi 2005 Architect
 
#3

Re: [Firebird] Trigger/Generatoren anlegen

  Alt 25. Aug 2005, 10:56
Zitat von Thanatos81:
SQL-Code:
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
So wird das wohl nix, der Trigger müsste etwa so aussehen wenn Dein Generator lfdNr_id heisst:

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:
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?
Die Reihenfolge wäre 1.) Tabelle anlegen, 2.) Generator anlegen und 3.) Trigger anlegen.

Zitat:
Dann müsste ich mich halt nur noch informieren, wie mein Generator auszusehen hat.
Ein Generator kann nur einen Integer Wert enthalten und wird mit
create generator <name_of_generator> angelegt.

Gruß,
Marcel
Marcel Gascoyne
Der Fehler sitzt immer vor der Tastatur
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: [Firebird] Trigger/Generatoren anlegen

  Alt 25. Aug 2005, 11:02
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: klick

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
  Mit Zitat antworten Zitat
Tom70

Registriert seit: 11. Mär 2005
33 Beiträge
 
#5

Re: [Firebird] Trigger/Generatoren anlegen

  Alt 25. Aug 2005, 11:08
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.
  Mit Zitat antworten Zitat
Hansa

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

Re: [Firebird] Trigger/Generatoren anlegen

  Alt 25. Aug 2005, 11:17
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#7

Re: [Firebird] Trigger/Generatoren anlegen

  Alt 25. Aug 2005, 11:19
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 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

@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?
  Mit Zitat antworten Zitat
Tom70

Registriert seit: 11. Mär 2005
33 Beiträge
 
#8

Re: [Firebird] Trigger/Generatoren anlegen

  Alt 25. Aug 2005, 11:39
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
  Mit Zitat antworten Zitat
Hansa

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

Re: [Firebird] Trigger/Generatoren anlegen

  Alt 25. Aug 2005, 12:06
Zitat von Thanatos81:
Genau, ich wollte keinen Designer verwenden. Kann man SPs nicht zur Laufzeit anlegen?
Kehre mal in Dich ! Kaum ist der Papst wieder weg und schon wird wieder Unfug getrieben. Ne, jetzt im Ernst. Bei so was stellt sich folgende Frage : ändert sich die Struktur der DB und zwar oft und zwar vor Ort im Einsatz ? Muß diese Voraussetzung tatsächlich erfüllt werden, dann gibt es zwei Wege. Delphi-Programm dafür schreiben (IMHO zu aufwändig) oder ein SQL-Script und das ausführen. Wenn es aber irgendwie geht, auf so was zu verzichten, dann sollte man es auch sein lassen. Der Verwaltungsaufwand ist ja nicht nur Trigger usw. zu schreiben, sondern auch den alten eventuell zu löschen usw.

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.

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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#10

Re: [Firebird] Trigger/Generatoren anlegen

  Alt 25. Aug 2005, 12:11
Zitat von Hansa:
Zitat von Thanatos81:
Genau, ich wollte keinen Designer verwenden. Kann man SPs nicht zur Laufzeit anlegen?
Kehre mal in Dich ! Kaum ist der Papst wieder weg und schon wird wieder Unfug getrieben. Ne, jetzt im Ernst. Bei so was stellt sich folgende Frage : ändert sich die Struktur der DB und zwar oft und zwar vor Ort im Einsatz ? [...]
Unfug hab ich auch getrieben, als der Papst noch im Lande war

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

Btw. kennt da jemand einen guten Freeware-Designer für Firebird-DBs, die nicht übern Server anzusprechen sind (embedded Firebird, halt)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:53 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