AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi UPDATE nicht ausführen, wenn nichts?
Thema durchsuchen
Ansicht
Themen-Optionen

UPDATE nicht ausführen, wenn nichts?

Ein Thema von himitsu · begonnen am 17. Jun 2016 · letzter Beitrag vom 21. Jun 2016
Antwort Antwort
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 17. Jun 2016, 14:34
Oder im Trigger prüfen was und ob sich etwas geändert hat und nur dann eine Aktion ausführen
Fritz Westermann
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.917 Beiträge
 
Delphi 12 Athens
 
#2

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 17. Jun 2016, 15:38
Oder im Trigger prüfen was und ob sich etwas geändert hat und nur dann eine Aktion ausführen
genau, das ist das Standardprocedere!
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 17. Jun 2016, 18:34
Nur mal so dahingedacht:
  • Der UPDATE -Trigger wird immer ausgelöst, wenn ein UPDATE Statement abgesetzt wird.
  • Ein TIMESTAMP Feld (mit ON UPDATE CURRENT_TIMESTAMP ) wird nur dann aktualisiert, wenn sich wirklich Daten in der Zeile ändern.
Im UPDATE -Trigger braucht man jetzt also nur noch zu prüfen, ob es eine Änderung im TIMESTAMP Feld gibt (IF OLD.ts <> NEW.ts THEN ) und schon kann man darauf gesondert reagieren.

So funktioniert es z.B. bei MySQL
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 18. Jun 2016, 22:51
Per Trigger mit :new/ :old zu arbeiten ist wahrscheinlich das gängige Verfahren.
Alternativ kannst Du das Update so gestalten, dass es
- 0 Rows betrifft und damit auch
- ein Trigger nicht zündet bzw.
- ein Trigger gar nicht definiert sein muss oder
- unspezifisch sein kann:
Für ein "leeres" Update kann man z.B. als Bedingung
Code:
where exists
mit
Code:
Select <aktueller Feldinhalt/Felder> from UpdateTable where..
except
Select <neue Feldwerte oder bestehende Feldwerte> from <jenachdem> <where ..>
kombinieren.

Das ist wahrscheinlich nicht viel weniger als "ganz viel und hier auch ganz viel", aber es hat den Charme, dass man nicht nachdenken muss und die Statements anhand der Felder der Tabelle generisch bauen kann (ohne PK und andere frei wählbare Ausnahmen). Ob es dann zündet, regelt das "except".
Was final geupdated wird, steht unabhängig davon in der Update ExpressionList. Kann man gut finden, weil weiterer Freiheitsgrad, kann aber auch falsch gemacht werden.

Andere DB können im Update statt der ExpressionList auch gleich Selects verwenden, dass macht es etwas eleganter.

Unterscheiden muss man hier bei den Where Bedingungen natürlich zwischen SingleRow Updates und Massenupdates.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 19. Jun 2016, 17:09
Aber warum so umständlich, wenn man das mit einem TIMESTAMP Feld komplett erschlagen kann?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 20. Jun 2016, 08:13
Es ist einfach eine Möglichkeit, damit und mit anderen Problemen umzugehen. Sozusagen eine Ikea Antwort, entdecke die Möglichkeiten.

Ich brauche/will/darf keinen Trigger,
Ich brauche/will/darf kein Update Feld,
Ich habe in PG nicht direkt die MySQL On Update Definition zur Verfügung,

Es ist flexibler als ein Catchall Update Timestamp:
Wenn bspw. beim Kunden ein Tippfehler in der Anschrift korrigiert wird, interessiert mich vielleicht dieses Update Event, wechselt aber ein Flag / Statusfeld durch eine BusinessOperation seinen Wert, interessiert mich das vielleicht überhaupt nicht als Kundenupdate Event, weil die BO den Event implizit logged/dokumentiert.

Und kompliziert ist ja relativ, innerhalb eines Update Statementgerüsts ist es nichts viel mehr als die Wiederholung einer Feldliste/Parameterliste.
Update myTable
set
<feldliste>
<parameterliste>
where
<corecondition>
and exists
(
select <feldliste> from myTable where <corecondition>
except
select <parameterlist> [from myTable where <corecondition]>
)
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.747 Beiträge
 
Delphi 12 Athens
 
#7

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 20. Jun 2016, 10:36
Und kompliziert ist ja relativ, innerhalb eines Update Statementgerüsts ist es nichts viel mehr als die Wiederholung einer Feldliste/Parameterliste.
Jupp, dieses Doppelte hätte man sich ja sparen können, wenn das UPDATE-Statement dafür eine integrierte Funktion hätte.

So ala dem SELECT DISTINCT ... (EIN Befehl zum Filtern von Wiederholungen) vielleicht ein UPDATE CHANGED table SET ... .


Im Prinzip kann ich ja "einfach" Den TEIL aus dem SET ins WHERE kopieren,
drumrum ein AND ( ...) , aus den Kommas je ein OR und fertig.

Vor eine Weile hatte ich ein Statement, da war das im SET nur knapp 20 Zeilen lang und bissl breit ... da sieht das "einfach" bissl blöd aus und bei Änderungen muß man dann auch beide Stellen anpassen, sonst knallt es ja.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (20. Jun 2016 um 11:46 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz