Einzelnen Beitrag anzeigen

ThomasBab

Registriert seit: 7. Mai 2007
Ort: Hallenberg
57 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Verwenden von Triggern für Firebird 2.5 DB

  Alt 13. Apr 2011, 14:40
Hallo!

Bin zwar kein Spezialist, aber vielleicht kann ich ein wenig Licht ins Dunkle bringen:

Hier ein praktisches Beispiel (Auszugsweise):

Die Tabelle:
Code:
CREATE GENERATOR ID;

CREATE TABLE IPCAM (
    ID       BIGINT NOT NULL,
    IDCAM    BIGINT NOT NULL,
    ANGELEGT DATUMUHRZEIT DEFAULT current_timestamp /* DATUMUHRZEIT = TIMESTAMP */ NOT NULL /* DATUMUHRZEIT = TIMESTAMP */,
    BILD     BLOB SUB_TYPE 0 SEGMENT SIZE 16384
);

/******************************************************************************/
/*                                Primary Keys                               */
/******************************************************************************/

ALTER TABLE IPCAM ADD CONSTRAINT PK_IPCAM PRIMARY KEY (ID);


/******************************************************************************/
/*                                Foreign Keys                               */
/******************************************************************************/

ALTER TABLE IPCAM ADD CONSTRAINT FK_IPCAM_1 FOREIGN KEY (IDCAM) REFERENCES CAMTYP (ID);


/******************************************************************************/
/*                                  Indices                                  */
/******************************************************************************/

CREATE INDEX IPCAM_IDX1 ON IPCAM (ANGELEGT);


/******************************************************************************/
/*                                  Triggers                                 */
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/*                            Triggers for tables                            */
/******************************************************************************/



/* Trigger: IPCAM_BIU0 */
CREATE OR ALTER TRIGGER IPCAM_BIU0 FOR IPCAM
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
begin
    if (new.id is null) then
    new.id = gen_id(id, 1);
    if (new.angelegt is null) then
    new.angelegt = current_timestamp;
end
^


SET TERM ; ^
Hier der Generator:

Code:
CREATE SEQUENCE ID;
ALTER SEQUENCE ID RESTART WITH 619995;


Nun der Codeauszug, um Daten einzutragen bzw. ein Update auszuführen:

Delphi-Quellcode:
procedure Tccamera.Speichercamtyp;
var
  Sql: string;
begin
  try
    if CamTypName = 'then
    begin
      ShowMessage('Kein Kameratyp angegeben!');
      exit;
    end;
    if CamTypID <= 0 then
    begin
      sql := 'insert into ' + Ftabtyp + ' (camname,adresse) values(:camname,:adresse);';
      dm.tTypen.StartTransaction;
      dm.qTypen.SQL.Text := sql;
      dm.qTypen.Params.ByNameAsString['camname'] := UTF8Decode(CamTypName);
      dm.qTypen.Params.ByNameAsString['adresse'] := UTF8Decode(CamTypAdresse);
    end
    else
    begin
      sql := 'update ' + Ftabtyp +
        ' set camname=:camname, adresse=:adresse where id=:id;';
      dm.tTypen.StartTransaction;
      dm.qTypen.SQL.Text := sql;
      dm.qTypen.Params.ByNameAsString['camname'] := UTF8Decode(CamTypName);
      dm.qTypen.Params.ByNameAsString['adresse'] := UTF8Decode(CamTypAdresse);
      dm.qTypen.Params.ByNameAsInt64['id'] := CamTypID;
    end;
    dm.qTypen.Execute;
    dm.tTypen.Commit;
  except
    on E: Exception do
    begin
      dm.tTypen.RollBack;
      ShowMessage(E.Message);
    end;
  end;
end;
Thomas

Geändert von ThomasBab (13. Apr 2011 um 14:54 Uhr) Grund: Tabellendefinition war unvollständig
  Mit Zitat antworten Zitat