![]() |
Datenbank: firebird • Version: 2.1 • Zugriff über: zeos
firebird Trigger
hallo zusammen,
ich weiss zwar nicht ob ich hier offtoppic bin, abert ich denke das gehört zu den DB. Nachdem ich nun mein RDBMS zu firebird gewechselt habe, vermisse ich die autoincrement Felder. Bei meiner Suche bin ich auf den Tipp gestossen einen Trigger zu verwenden. Leider kenne ich mich damit gar nicht aus, und die angegebene Syntax bringt bei der Verwendung mit IBexpert einen error
Delphi-Quellcode:
wie geht das richtig?
ACTIVE BEFORE INSERT POSITION 0
AS BEGIN IF (NEW.ID IS NULL) THEN NEW.ID = GEN_ID(GEN_TBL_TEST_ID,1); Gruss KH |
Re: firebird Trigger
Ist : GEN_TBL_TEST_ID grün unterstrichen ? Ansonsten fehlt das.
|
Re: firebird Trigger
Wenn du den Trigger im IBExpert anlegen lässt, kannst du auch festlegen das der Generator automatisch erzeugt wird.
|
Re: firebird Trigger
Wo kann man das festlegen ? :shock: Unter dem Aspekt, dass man besser nur einen einzigen DB-weiten Generator anlegen sollte und nicht mehrere davon, womöglich für jede Tabelle einen, würde das auch keinerlei Sinn machen.
|
Re: firebird Trigger
Zitat:
funktioniert jetzt, wenn ich den Generator manuell anlege. Wo kann das definiert werden dass er automatisch erzeugt wird? Gruss KH |
Re: firebird Trigger
Liste der Anhänge anzeigen (Anzahl: 2)
Also ich lege immer pro Tabelle (für den PK) einen an. Was aus meiner Sicht auch sinn macht!
|
Re: firebird Trigger
IIRC gleich auf dem ersten Reiter die beiden Checkboxen "Erzeuge Generator" und "Erzeuge Trigger" anhaken.
OK, sind doch 2 verschiedene Reiter. Übrigens lösche ich die If-Abfrage im Trigger immer raus, damit der Wert nicht von außen gesetzt werden kann. Dazu gab es vor langer Zeit mal einen Thread hier. |
Re: firebird Trigger
Beim Anlegen neuer Tabellenfelder ist rechts eine Checkbox Autoinc. Wird die gecheckt, dann kann man für dieses Feld einen Generator anlegen oder existierenden benutzen.
Zitat:
|
Re: firebird Trigger
Zitat:
ich danke euch Gruss Kh |
Re: firebird Trigger
Zitat:
|
Re: firebird Trigger
Nein, denn Profis wissen das halt, wir blöden Amateure brauchen das gar nicht zu wissen :zwinker:
|
Re: firebird Trigger
Zitat:
willst du damit sagen, du legst einen trigger für _alle_ tabellen einer DB an ? Gruss KH |
Re: firebird Trigger
Nicht einen Trigger, sondern einen Generator.
|
Re: firebird Trigger
Zitat:
hab mich gerade gewundert wie das geht ;-) naja einen Generator in allen Triggern zu verwenden, ist gar keine schlechte Idee. Die erledigen ja eh alle die gleiche Arbeit. Gruss KH |
Re: firebird Trigger
Dafür hast du dann einen Nummernkreis für alle deine Tabellen
|
Re: firebird Trigger
Zitat:
|
Re: firebird Trigger
Zitat:
EDIT: nee ist glaube ich doch keine so gute idee, ich wäre mal auf die Ausführung von hansa gespannt, was für einen Ärger er da meint. Gruss KH |
Re: firebird Trigger
Zitat:
Warum pro Table einen eigenen Generator ? Das weiß der Kuckuck. :P Kommt wohl lediglich daher, dass immer von einem Generator/Trigger "Gespann" gesprochen wird. Das alleine schon suggeriert x Tabellen = x Generatoren. Ein theoretisches Argument wäre die Anzahl der Generatorenwerte. Zitat:
Warum pro Table keinen eigenen Generator, sondern nur einen ? Es geht um die bestmögliche referentielle Integrität der DB und zwar darum, diese auch langfristig zu sichern. Bleiben wir mal bei der Telekom : angenommen die speichern die Verbindungsdaten in 10 Rechenzentren und in regelmäßigen Abständen sollen die Daten zentral gespeichert werden. Die dürfen sich natürlich nicht ins Gehege kommen. Die Rechenzentren haben jeweils einen Generator-Startwert von 0 dann 1.000.000.000.000.000 bis 9.000.000.000.000.000. Dürfte reichen und es ist sogar noch mehr Platz. Und jetzt ? Selbst wenn unterschiedliche Rechenzentren die Daten von ein und demselben Kunden erfassen und diese dann zusammengewürfelt werden, dann ist noch immer alles in Ordnung. Würde man das anders machen, dann wären die IDs nicht mehr eindeutig zuzuordnen. Es wäre nicht mal ein permanenter Datenabgleich nötig. Und der Fragesteller braucht sich nur einmal den Namen des Generators zu merken. :zwinker: P.S. wg. roter Kasten : die "Nummernkreise" sind da schon indirekt drin. Sollte es bei den 10 Rechenzentren gleiche Rechn.Nummern etc. geben und die Daten müssten erst später zusammengeführt werden, dann ist es ein leichtes einmalig eine 0..9 davorzuhängen und fertig. Die IDs müssen aber bleiben wie sie sind. |
Re: firebird Trigger
Wenn die Inhalte der Tabellen aber verschieden ist, stellt das kein Problem dar.
|
Re: firebird Trigger
Du willst das wohl nicht verstehen ? :mrgreen: Der Nutz-Inhalt der Tabellen (also der für das Programm gedachte) ist ziemlich egal, solange nur die DB-interne ID eindeutig ist. Und genau die sollte eben nicht manipuliert werden.
|
Re: firebird Trigger
Ich glaube, dass geht langsam ins Philosophische :) Ich sehe einen wirklichen Sinn auch nur darin, wenn die Tabellen die gleiche Struktur haben. Ich hatte mal einen Fall, wo ein Kunde wollte, das in der DB Kundendaten pro Filiale in separaten Tabellen gespeichert werden. Da hab ich auch für diese Tabellen nur einen Generator verwendet, um später, z.B. bei einer Filialzusammenlegung, weniger Aufwand zu haben. Aber ansonsten bin ich halt auch nur Amateur ;)
|
Re: firebird Trigger
Du kannst dir das auch autom. für alle deine Tabellen erzeugen lassen:
![]() |
Re: firebird Trigger
Damit hast du dich auch als Amateur geoutet :stupid:
|
Re: firebird Trigger
Es gibt natürlich Argumente FÜR einen eigenen Generator: Wenn ich wissen will, ob ein Datensatz aufgrund eines Rollbacks nicht gespeichert wurde, also eine 'Lücke' in der Sequenz ist, wäre das mit einem eigenen Generator für diese Tabelle einfach zu lösen. Ansonsten sprechen nur ästhetische Gründe für mehrere Generatoren (Und Bequemlichkeit bei der Erstellung des Schemas). Ob die Wahl (einer / mehrere) nun konkrete Rückschlüsse auf das Entwicklerniveau (Amateur/Profi) zulässt, sei mal dahingestellt.
|
Re: firebird Trigger
hallo zusammen,
ich danke euch für die ausführlichen Meinungen. Gruss Kh |
Re: firebird Trigger
Zitat:
IOW: Ich werde mich wohl kaum wegen Hansa in den Schlaf weinen *g* Er hat da aber einen Punkt: Wenn man bigint (iow Int64) als key nutzt, dann kann man sehr wohl eine Sequence für ALLE Tabellen haben. Das Problem ist aber, dass diese Art von "ObjectID" gar nicht sooo nützlich ist, wie man es anfangs vermutet. Code, der den Type eines Objektes nicht mehr zur Identifizierung herannimmt, würde nicht mehr mit nicht-persistenten Objekten klar kommen. Oder nur sehr unintuitiv, und auf dem Wege wäre viel von dem Nutzen einer DB-globalen unique ID wieder aufgebraucht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:17 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