Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
Delphi XE5 Enterprise
|
Re: Feldänderugnen im Trigger Prüfen Firebird
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
|