Einzelnen Beitrag anzeigen

Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Clientdaten und Generator

  Alt 26. Apr 2004, 16:50
Hallo Quake,
meine Tabellen haben grundsätzlich alle eine Spalte mit dem Namen ID.
Dies ist immer die erste Spalte und gleichzeitig der Primary Key.
Den Wert für die Spalte ID hole ich mir über einen Generator.
Den Werte hole ich aber erst vom Generator ab, wenn ich des Insert abgesetzt habe.
Dafür verwende ich immer einen Trigger.
Hiermal ein Beispiel für Interbase:
Code:
/* Domain definitions */
CREATE DOMAIN "TINT" AS INTEGER;
CREATE DOMAIN "TSTRING30" AS VARCHAR(30) CHARACTER SET ISO8859_1 COLLATE DE_DE;

/* Table: KONSOTREE, Owner: SYSDBA */

CREATE TABLE "KONSOTREE"
(
  "ID"  INTEGER NOT NULL,
  "PARENTID"  INTEGER NOT NULL,
  "ENTITY"  VARCHAR(15) CHARACTER SET ISO8859_1 COLLATE DE_DE,
  "NODETEXT"  "TSTRING30" COLLATE DE_DE,
  "KIND"  "TINT",
 PRIMARY KEY ("ID")
);
SET TERM ^ ;

CREATE GENERATOR gen_konsotree ^

/* Triggers only will work for SQL triggers */

CREATE TRIGGER "TRG_KONSOTREE_0" FOR "KONSOTREE"
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then new.id=gen_id(gen_konsotree,1);
end
 ^

CREATE TRIGGER "TRG_KONSOTREE_1" FOR "KONSOTREE"
ACTIVE AFTER DELETE POSITION 0
as
begin
  DELETE FROM konsotree WHERE konsotree.parentid=OLD.ID;
end
 ^

COMMIT WORK ^
SET TERM ;^
Der Trigger "TRG_KONSOTREE_0" feuert, bevor der Datensatz eingefügt wird. Interessant ist hier folgende Zeile
Code:
if (new.id is null) then new.id=gen_id(gen_konsotree,1);
Nur wenn die ID nicht mit gegeben wurde, wird der Inhalt für die ID aus dem Generator mit
Code:
gen_id(gen_konsotree,1)
geholt.

Wenn ich den ID Wert benötige, bevor ich den Datensatz hinzufüge hole ich mir den nächsten Generatorwert über eine Storedprocedure:
Code:
COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;

/* Stored procedures */

CREATE PROCEDURE "GET_KONSOTREE"
RETURNS
(
  "NEWID" INTEGER
)
AS
BEGIN EXIT; END ^


ALTER PROCEDURE "GET_KONSOTREE"
RETURNS
(
  "NEWID" INTEGER
)
AS
BEGIN
  NewID = GEN_ID(GEN_KONSOTREE,1);
END
 ^

SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;
Fazit: Als Lösung schlage ich Dir die Verwendung von Triggern vor.

Folgendes Buch kann ich schwer empfehlen:InterBase-Datenbankentwicklung mit Delphi
I come from outer space to save the human race
  Mit Zitat antworten Zitat