Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Trigger Felder verketten (https://www.delphipraxis.net/204578-trigger-felder-verketten.html)

Eppos 8. Jun 2020 16:50

Datenbank: Firebird • Version: 3.0 • Zugriff über: FireDac

Trigger Felder verketten
 
Hallo zusammen,

ich bin gerade dabei, die Datenbank etwas zu optimieren. An vielen Stellen werden unötige Verkettungen durchgeführt.
Nun habe ich mir gedacht, dass ich durch einen Trigger die Adresse zusammensetzen lassen kann.

Delphi-Quellcode:
Create Trigger Adresse_ai_au
active after insert or update on Adressen
as
begin
new.Adresse = (Select Coalesce(Titel,'') || ' ' || Coalesce(Vorname, '') || ' ' || Coalesce(Nachname, '') from Adressen where ID = new.ID);
end
Nur leider bringt er mir [FireDAC][Phys][FB]attempted update of read-only column und ich weiß nicht warum.

Jemand eine Idee?

VG

himitsu 8. Jun 2020 17:04

AW: Trigger Felder verketten
 
Im AfterInsert/-Update wurde bereits gespeichert und es lässt sich nichts mehr Ändern.
Du kannst dort maximal ein neues UPDATE-Statement auslösen.
SQL-Code:
--UPDATE Adressen SET Adresse = concat(new.Titel, ' ', new.Vorname, ' ', new.Nachname) WHERE ID = new.ID;

SQL-Code:
UPDATE Adressen SET Adresse = concat(Titel, ' ', Vorname, ' ', Nachname) WHERE ID = new.ID;

(auf Endlosschleifen achten)

Was du willst, ist wohl im BeforeInsert/-Update zu besser lösen.
SQL-Code:
new.Adresse = concat(new.Titel, ' ', new.Vorname, ' ', new.Nachname);

(wird Titel/Vorname/Nachname in einem anderen Trigger geändert, dann auf die Reihenfolge der Trigger achten)

Einige DBMS kennen auch sowas wie ein
SQL-Code:
new.Adresse = concat_ws(' ', new.Titel, new.Vorname, new.Nachname);
,
also "concatenate with separator", wo
Delphi-Quellcode:
' '
als Trennzeichen nur zwischen vorhandene Einträge (nicht NULL) eingefügt wird.


Kennt Firebird Writeable-Views?
Wenn ja, dann keine doppelte Datenhaltung, sondern sich einen View erstellen, der das bei der Abfrage zusammensetzt.

Eppos 8. Jun 2020 17:18

AW: Trigger Felder verketten
 
Perfekt danke!

himitsu 8. Jun 2020 17:28

AW: Trigger Felder verketten
 
Büdde.

PS: Hatte noch was nachgetragen. (sah nicht das du noch da warst und auch schon geantwortet hattest)
Der letzte Satz/Frage, bezüglich der doppelten Daten,
und das concat/concat_ws.

Alternativ kann man es auch umdehen und ins Coalesce einfügen.
SQL-Code:
Coalesce(Titel || ' ', '') || Coalesce(Vorname || ' ', '') || Coalesce(Nachname, '')


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 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