![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: IBEASY+
Firebird Db Trigger Problem
Hallöchen
ich komme grad irgendwie nicht weiter. Ich habe einen Generator sowie einen Trigger mittels IBEasy angelegt. Wenn ich nun in der betreffenden Tabelle einen neuen DS anlege passiert: nichts.
Code:
BEFORE INSERT und AKTIV sind eingesetzt.
as
begin if ((new.ID is null) or (new.ID = 0)) then begin new.ID = gen_id( GENTEST, 1 ); end end Meiner Meinung nach ist die Tabelle in Ordnung und der Generator auch. Trotzdem wird keine ID angelegt wenn ein neuer DS angelegt wird (im IBEasy). Mache ich was falsch? Grüße |
AW: Firebird Db Trigger Problem
Der Wert wird erst beim Post gesetzt. Bei der Neuanlage ( + o.aä; kenne IBEasy nicht) bleibt das Feld ersteinmal lle (NULL).
Der Trigger wirkt auch nur wenn man diesen Wert nicht vor dem Abschliessen ändert ( oder mit 0 belegt) |
AW: Firebird Db Trigger Problem
Danke Markus
das hatte ich auch gedacht aber beim Post meckert er rum dass ID nicht leer sein darf. Also greift irgendwie der Trigger nicht. Wo kann ich noch nachsehen? |
AW: Firebird Db Trigger Problem
Ich glaube eher, dass dies ein Problem des Tools ist. Gib mal 0 an.
|
AW: Firebird Db Trigger Problem
Daran habe ich auch schon gedacht und
ein bissl herumgespielt, allerdings ohne Ergebnis. Vllt. sollte ich eine andere GUI suchen. Es gibt ja mehrere für FB. Danke erstmal. |
AW: Firebird Db Trigger Problem
Hi,
du könnest mit dir auch "von Hand" eine neue ID holen und diese dem Insert gleich mitgeben.
SQL-Code:
Das hat den Vorteil, dass für evt. Detail-Datensätze
select
gen_id( GEN_DeineTabelle_ID, 1 ) as NeueID from RDB$Database gleich eine Master_ID bekannt ist. alex |
AW: Firebird Db Trigger Problem
Das kann man aber auch durch RETURNING erreichen
|
AW: Firebird Db Trigger Problem
Danke für Eure Antworten
Ich hatte mich auch schon damit beschäftigt ![]() es ist halt ein Umdenken nötig wenn man vorher nur Jet/Access benutzt hat. Aber ist
Code:
auch Multiuser tauglich?
select
gen_id( GEN_DeineTabelle_ID, 1 ) as NeueID from RDB$Database Ich werde mit einer Testanwendung erstmal sehen ob IBEasy nicht triggert oder ob es in der DB ein Problem gibt. Grüße & Danke |
AW: Firebird Db Trigger Problem
Zitat:
|
AW: Firebird Db Trigger Problem
Zitat:
auch das Insert geschickt wird oder eine eigene? Nutzt man evtl. dafür die TZUpdateSQL ( die für mich immer noch rätselhaft ist). Grüße |
AW: Firebird Db Trigger Problem
Kommt darauf an, ob Zeos RETURNING versteht, wenn ja:
SQL-Code:
Sonst als getrennte Abfrage.
insert into <Tabelle> ( ID, <weitere Felder>)
values ( (select gen_id( GEN_DeineTabelle_ID, 1 ) from RDB$Database), <weitere Werte>) RETURNING ID; |
IBExpert
Liste der Anhänge anzeigen (Anzahl: 1)
@Privateer3000:
Ich verwende zum Erstellen und Ändern von Firebird-Datenbank immer die Personalversion von ![]() IBExpert bietet beim Erstellen einer Tabelle die Möglichkeit, ein AutoInc-Feld zu definieren, wie in der angehängten Grafik dargestellt. Dabei kann man sich gleich automatisch den entsprechenden Trigger, den Generator und eine Prozedur generieren lassen. Die sehen dann so aus: Prozedur SP_GEN_PROJEKT_ID
Code:
Trigger PROJEKT_BI
begin
ID = gen_id(GEN_PROJEKT_ID, 1); suspend; end /* DLL */ SET TERM ^ ; CREATE OR ALTER PROCEDURE SP_GEN_PROJEKT_ID returns ( ID integer) as begin ID = gen_id(GEN_PROJEKT_ID, 1); suspend; end^ SET TERM ; ^ /* Existing privileges on this procedure */ GRANT EXECUTE ON PROCEDURE SP_GEN_PROJEKT_ID TO SYSDBA;
Code:
Generator GEN_PROJEKT_ID
as
begin if (new.IDX_PROJEKT is null) then new.IDX_PROJEKT = gen_id(GEN_PROJEKT_ID,1); end /* DLL */ /******************************************************************************/ /* Following SET SQL DIALECT is just for the Database Comparer */ /******************************************************************************/ SET SQL DIALECT 3; CREATE GENERATOR GEN_PROJEKT_ID; SET TERM ^ ; CREATE OR ALTER TRIGGER PROJEKT_BI FOR PROJEKT ACTIVE BEFORE INSERT POSITION 0 as begin if (new.IDX_PROJEKT is null) then new.IDX_PROJEKT = gen_id(GEN_PROJEKT_ID,1); end ^ SET TERM ; ^
Code:
CREATE SEQUENCE GEN_PROJEKT_ID;
ALTER SEQUENCE GEN_PROJEKT_ID RESTART WITH 1; /* Old syntax is: CREATE GENERATOR GEN_PROJEKT_ID; SET GENERATOR GEN_PROJEKT_ID TO 1; */ |
AW: Firebird Db Trigger Problem
Vielen Dank.
Ich habe mit IBExpert die Trigger ausprobiert die ich im IBEasy erstellt habe. Siehe da: sie funktionieren. Es liegt am IBEasy. Vielen Dank für den IBExpert Tipp. |
AW: Firebird Db Trigger Problem
By the Way
kann man mit Generatoren auch ein Timestamp realisieren so das beim DS erstellen ein Timestamp eingetragen wird? Grüße PS: Ich weiß offTopic, aber wollte deswegen keinen neuen Thread aufmachen |
AW: Firebird Db Trigger Problem
Zitat:
|
AW: Firebird Db Trigger Problem
Zitat:
Denn es gilt : Trigger liegt in der DB. D.h., der schlägt immer zu, egal welches Programm für die DB benutzt wird ! Also eigenes Programm, IBExpert, anderes eigenes Programm oder sonstwas. Eventuell ausser IBEasy. :P |
AW: Firebird Db Trigger Problem
Zitat:
|
AW: Firebird Db Trigger Problem
Zitat:
Direkt in den Generatorwert in dieser Syntax? |
AW: Firebird Db Trigger Problem
Zitat:
Wenn ich nur den Wert hole ohne ihn zu reservieren gehts schief. Oder liege ich da falsch... |
AW: Firebird Db Trigger Problem
Zitat:
Zitat:
|
AW: Firebird Db Trigger Problem
Zitat:
Das mit den Generatoren und Timestamp : auch gleich vergessen. Generator=Ganzzahl (integer oder Bigint). Perlsau hat wohl Generatoren und Trigger verwechselt. :stupid: Wenn ich nämlich z.B. ein Feld ANGELEGT in meiner Tabelle habe, dann hindert mich keiner dran, folgende Zeilen (hier in einem Insert-Trigger) hinzuzufügen:
Code:
IF (NEW.ANGELEGT IS NULL) THEN
NEW.ANGELEGT = CURRENT_TIMESTAMP; |
AW: Firebird Db Trigger Problem
Vielen Dank @alle
das muss ich erstmal gut kauen und verdauen. Langsam finde ich Gefallen an den Triggern :) |
AW: Firebird Db Trigger Problem
Zitat:
Ruft nicht ein OnAfterUpdate-Trigger sich selbst wieder auf, wenn darin ein Update vorgenommen wird? Das würde dann doch eine Endlos-Schleife ergeben ... |
AW: Firebird Db Trigger Problem
Update ? Ja, After-Update-Trigger. Ungefähr so :
Code:
Der Trigger macht doch das Update schon. Das Delphi-Dataset stösst ja das Update an, aber nicht für das Feld LETZTEAENDERUNG. Das darf im Programm nicht besetzt werden, damit der Trigger richtig zuschlägt.
UPDATE TABELLE SET
LETZTEAENDERUNG = CURRENT_TIMESTAMP WHERE (ID = OLD.ID) AND ((LETZTEAENDERUNG IS NULL) OR (LETZTEAENDERUNG <> CURRENT_TIMESTAMP)); |
AW: Firebird Db Trigger Problem
Zitat:
|
AW: Firebird Db Trigger Problem
Zitat:
Code:
Wozu sollte hier noch ein erneutes Update gemacht werden?
CREATE TRIGGER TABELLE_BU FOR TABELLE
ACTIVE BEFORE UPDATE POSITION 1 AS BEGIN new.LETZTEAENDERUNG = CURRENT_TIMESTAMP; END |
AW: Firebird Db Trigger Problem
Na ja, man könnte das wohl auch so machen, wenn die WHERE - Klausel nicht wichtig ist. Minimalistischer gehts nimmer. :lol:
Das Beispiel gilt für folgenden Fall : 1. das Feld LETZTEAENDERUNG ist noch nicht besetzt : Datensatz wurde also noch nie geändert. Wird über IS NULL geprüft. Feld wird dann besetzt. 2. LETZTEAENDERUNG ist schon bestückt. Z.B. von Hand, maschinell aus alten Datenbeständen oder eben durch ein vorhergehendes Update. Nur mit IS NULL würde LETZTEAENDERUNG nur bei dem allerersten Update aktualisiert und danach nie mehr ! Also wird noch eine Bedingung gebraucht, dei für NOT IS NULL gilt ! Bitte vor Kommentaren genau lesen ! Das ist logisch nicht so einfach zusammenzubauen, wie es auf den ersten Blick aussieht ! Nebenbei bemerkt, man muss sich die Trigger wie Kettenhunde vorstellen. Der von TBx ist dabei vollständig von der Kette gelassen und beisst immer zu, ohne wenn und aber. Meiner ist etwas gezähmt. |
AW: Firebird Db Trigger Problem
Im Normalfall ist es auch gewollt das im Feld die letzte Änderung eines Datensatzes steht. Ich würde also wie TBX vom Normalfall ausgehen und nicht den Sonderfall bearbeiten, dass dies nur unter bestimmten Bedingungen gelten soll. Zudem mir die Sinnhaftigkeit deines Vergleiches nicht ganz einleuten will. ( Da ein CURRENT_TIMESTAMP nie NULL ist, ist der erste Teil der Bedingung überflüssig und wenn zufällig schon der gleiche Wert da stehen sollte [ was sehr unwahscheinlich ist] schadet es nicht diesen zu überschreiben).
Ich würde auch wie Thomas den BeforeInsert-Trigger bevorzugen, da der Timestamp ja zu diesem Vorgang gehört und sich auf die selbe Tabelle bezieht ( keine Logvorgang o.ä). |
AW: Firebird Db Trigger Problem
Zitat:
|
AW: Firebird Db Trigger Problem
Zitat:
Magst Du mal die genaue Meldung posten? Hast Du noch weitere Trigger auf der Tabelle definiert? |
AW: Firebird Db Trigger Problem
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:33 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 by Thomas Breitkreuz