AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Feldänderugnen im Trigger Prüfen Firebird
Thema durchsuchen
Ansicht
Themen-Optionen

Feldänderugnen im Trigger Prüfen Firebird

Ein Thema von Pro_RJ · begonnen am 16. Apr 2008 · letzter Beitrag vom 17. Apr 2008
Antwort Antwort
Seite 2 von 3     12 3      
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#11

Re: Feldänderugnen im Trigger Prüfen Firebird

  Alt 16. Apr 2008, 15:37
gibt es keine möglichkeit das über eine schleife zu lösen?

in etwar so?
SQL-Code:
declare variable FLDName VarChar(25);
begin
  For
  Select RF.RDB$Field_Name
  from RDB$Relation_FIelds RF
  where Upper(RF.RDB$Relation_Name) = 'ADRESSEN'
  into :FLDName
  do
  Begin
    if (Old.FLDName <> New.FLDName) then execute procedure SetzeAenderungskKZ(:FLDName,New.Zaehler);
  end
end
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: Feldänderugnen im Trigger Prüfen Firebird

  Alt 16. Apr 2008, 15:41
Du müsstest dir dann das Statement manuell im trigger aufbauen lassen. Ich vermute allerdings dass dann die Performance vollends flöten ist.
Markus Kinzler
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#13

Re: Feldänderugnen im Trigger Prüfen Firebird

  Alt 16. Apr 2008, 15:44
Ich dachte es in etwa so:
Die StoredProc "SetzeAenderungskKZ" speichert das Feld, welches sich geändert hat in einer extra Tabelle ab.
Ein Timer geht alle 5 min diese Tabelle durch und stellt alle Datensätze aller User wieder gleich.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Feldänderugnen im Trigger Prüfen Firebird

  Alt 16. Apr 2008, 16:02
Du könntest, wie schon erwähnt die abfrage im Trigger dynamisch zusammenbauen und dann ausführen.

SQL-Code:
<schleife>
  sql = sql || ...
</schleife>
EXECUTE STATEMENT sql
Markus Kinzler
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#15

Re: Feldänderugnen im Trigger Prüfen Firebird

  Alt 16. Apr 2008, 16:05
Naja ich wollte ja im Trigger die "Old" und die "New" Werte vergleichen,damit ich nur die speichere, die Sich geändert haben.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#16

Re: Feldänderugnen im Trigger Prüfen Firebird

  Alt 16. Apr 2008, 17:16
Du kannst auch die IBObjects verwenden, da können die visuellen Komponenten die Änderung des Datensatzes farblich darstellen.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#17

Re: Feldänderugnen im Trigger Prüfen Firebird

  Alt 16. Apr 2008, 18:44
naja ich wollte es ja am liebsten auf Datenbankebene machen.
  Mit Zitat antworten Zitat
alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#18

Re: Feldänderugnen im Trigger Prüfen Firebird

  Alt 16. Apr 2008, 21:35
Hallo Jens,

Wenn die Adressen sowieso immer identisch sein sollen, dann spielt es keine doch keine
Rolle ob du nur die geänderten Felder oder gleich alle synchronisierst.
Dafür sparst du dir aber der Vergleich und den Zusammenbau der SQL alles was mit
dem "Execute Statement" zusammenhängt.
Allerdings würde ich auf keinen Fall diese Methode wählen.
Statt dessen würde ich wie bereits von dfried vorgeschlagen eine View verwenden.
Selbstverständlich kann auch eine View mit Trigger updatefähig gemacht werden.

Kleines Beispiel:


SQL-Code:
/******************************************************************************/
/****         Generated by IBExpert 2007.12.08 16.04.2008 21:29:04         ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES ISO8859_1;

SET CLIENTLIB 'C:\Programme\Firebird\Firebird_2_0\bin\fbclient.dll';

CREATE DATABASE 'PRO1/60050:D:\Daten\TestDB\TESTDB1.FDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 8192
DEFAULT CHARACTER SET ISO8859_1;



/******************************************************************************/
/****                               Domains                                ****/
/******************************************************************************/

CREATE DOMAIN DOM_ID AS
INTEGER;

CREATE DOMAIN VCHAR30 AS
VARCHAR(30);



/******************************************************************************/
/****                              Generators                              ****/
/******************************************************************************/

CREATE GENERATOR GEN_ADRESSE_ID;
SET GENERATOR GEN_ADRESSE_ID TO 7;

CREATE GENERATOR GEN_BENUTZER_ID;
SET GENERATOR GEN_BENUTZER_ID TO 3;



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE ADRESSE (
    ID DOM_ID NOT NULL,
    NACHNAME VCHAR30,
    VORNAME VCHAR30,
    STR VCHAR30,
    PLZ VCHAR30,
    ORT VCHAR30
);

CREATE TABLE BENUTZER (
    ID DOM_ID NOT NULL,
    BENUTZERNAME VCHAR30
);



/******************************************************************************/
/****                                Views                                 ****/
/******************************************************************************/


/* View: ADRESSEN */
CREATE VIEW ADRESSEN(
    BENUTZER_ID,
    ADRESSE_ID,
    NACHNAME,
    VORNAME,
    STR,
    PLZ,
    ORT)
AS
SELECT
  B.ID,
  A.ID,
  A.NACHNAME,
  A.VORNAME,
  A.STR,
  A.PLZ,
  A.ORT
FROM
  BENUTZER B,
  ADRESSE A
;


INSERT INTO ADRESSE (ID, NACHNAME, VORNAME, STR, PLZ, ORT) VALUES (1, 'Walkes', 'Otto', 'Kleine Gasse', NULL, NULL);
INSERT INTO ADRESSE (ID, NACHNAME, VORNAME, STR, PLZ, ORT) VALUES (2, 'Schmidt', 'Heinz', NULL, NULL, NULL);
INSERT INTO ADRESSE (ID, NACHNAME, VORNAME, STR, PLZ, ORT) VALUES (3, 'Müller', 'Lieschen', NULL, NULL, NULL);
INSERT INTO ADRESSE (ID, NACHNAME, VORNAME, STR, PLZ, ORT) VALUES (4, 'Rübe', 'Kunibert', NULL, NULL, NULL);
INSERT INTO ADRESSE (ID, NACHNAME, VORNAME, STR, PLZ, ORT) VALUES (7, 'dddd', NULL, NULL, NULL, NULL);

COMMIT WORK;

INSERT INTO BENUTZER (ID, BENUTZERNAME) VALUES (1, 'User1');
INSERT INTO BENUTZER (ID, BENUTZERNAME) VALUES (2, 'User2');
INSERT INTO BENUTZER (ID, BENUTZERNAME) VALUES (3, 'User3');

COMMIT WORK;



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

ALTER TABLE ADRESSE ADD CONSTRAINT PK_ADRESSE PRIMARY KEY (ID);
ALTER TABLE BENUTZER ADD CONSTRAINT PK_BENUTZER PRIMARY KEY (ID);


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


SET TERM ^ ;


/******************************************************************************/
/****                     Triggers for updatable views                     ****/
/******************************************************************************/

ALTER TRIGGER ADRESSEN_AIUD0
AS
BEGIN
  POST_EVENT 'ADRESSEN_CHANGE';
END
^

ALTER TRIGGER ADRESSEN_BIUD0
AS
begin
  if ((INSERTING) or (UPDATING)) then
  BEGIN
    IF (EXISTS(SELECT ID FROM ADRESSE WHERE (ID = NEW.ADRESSE_ID))) THEN
      UPDATE ADRESSE
      SET
        NACHNAME = NEW.NACHNAME,
        VORNAME = NEW.VORNAME,
        STR = NEW.STR,
        PLZ = NEW.PLZ,
        ORT = NEW.ORT
      WHERE (ID = NEW.ADRESSE_ID);
    ELSE
      INSERT INTO ADRESSE (
        ID,
        NACHNAME,
        VORNAME,
        STR,
        PLZ,
        ORT)
      VALUES (
        NEW.ADRESSE_ID,
        NEW.NACHNAME,
        NEW.VORNAME,
        NEW.STR,
        NEW.PLZ,
        NEW.ORT);
  END
  if (DELETING) then
  BEGIN
    DELETE FROM ADRESSE
    WHERE (ID = OLD.ADRESSE_ID);
  END
end
^

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



/* Trigger: ADRESSE_BI */
CREATE TRIGGER ADRESSE_BI FOR ADRESSE
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_ADRESSE_ID,1);
END
^

/* Trigger: BENUTZER_BI */
CREATE TRIGGER BENUTZER_BI FOR BENUTZER
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_BENUTZER_ID,1);
END
^

SET TERM ; ^
alex
Alexander
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#19

Re: Feldänderugnen im Trigger Prüfen Firebird

  Alt 17. Apr 2008, 09:59
Morsche,

Danke erstmal für die Hilfreichen Tipps.

Ich werde mir den Trigger doch per Schleife erzeugen und dann manuell Synchronisieren.
Die Idee mit dem View ist sehr gut aber dann hätte der User, für den das gedacht ist, eine einzelne Datenbank und eine komplett eigene Progrmmversion.
Das heist er ist nicht mehr über die "normale" Programmpflege wartbar.Sondern es müssten sämtliche Updates für seine Programmversion extra zurecht gemacht werden. Das ist schlicht und ergreifend nicht Pflegbar.

Deshalb muss ich leider die schlechtere Variant nutzen.Aber damit hat wieder jeder User das gleiche Programm und den gleichen Datenbankaufbau.

Wenn ihr noch Ideeen habt wie ich den Trigger einfacher aufbauen und pflegen kann wäre ich euch sehr dankebar.


mfg Jens
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#20

Re: Feldänderugnen im Trigger Prüfen Firebird

  Alt 17. Apr 2008, 10:01
Nein, wenn der View heisst wie die Tabelle vorher hies, müssen am Programm keine Änderungen gemacht werden!
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 09:16 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