AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Trigger Felder verketten

Trigger Felder verketten

Ein Thema von Eppos · begonnen am 8. Jun 2020 · letzter Beitrag vom 8. Jun 2020
Antwort Antwort
Eppos

Registriert seit: 7. Aug 2006
Ort: Heilbronn
483 Beiträge
 
Delphi XE5 Ultimate
 
#1

Trigger Felder verketten

  Alt 8. Jun 2020, 16:50
Datenbank: Firebird • Version: 3.0 • Zugriff über: FireDac
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.149 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Trigger Felder verketten

  Alt 8. Jun 2020, 17:04
Im AfterInsert/-Update wurde bereits gespeichert und es lässt sich nichts mehr Ändern.
Du kannst dort maximal ein neues UPDATE-Statement auslösen.
--UPDATE Adressen SET Adresse = concat(new.Titel, ' ', new.Vorname, ' ', new.Nachname) WHERE ID = new.ID;
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.
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 new.Adresse = concat_ws(' ', new.Titel, new.Vorname, new.Nachname); ,
also "concatenate with separator", wo ' ' 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 8. Jun 2020 um 17:29 Uhr)
  Mit Zitat antworten Zitat
Eppos

Registriert seit: 7. Aug 2006
Ort: Heilbronn
483 Beiträge
 
Delphi XE5 Ultimate
 
#3

AW: Trigger Felder verketten

  Alt 8. Jun 2020, 17:18
Perfekt danke!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.149 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Trigger Felder verketten

  Alt 8. Jun 2020, 17:28
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.
Coalesce(Titel || ' ', '') || Coalesce(Vorname || ' ', '') || Coalesce(Nachname, '')
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 8. Jun 2020 um 17:31 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf