AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken [MariaDB] Update-Trigger der die selbe Tabelle updaten soll

[MariaDB] Update-Trigger der die selbe Tabelle updaten soll

Ein Thema von Medium · begonnen am 30. Jul 2020 · letzter Beitrag vom 30. Jul 2020
Antwort Antwort
Medium

Registriert seit: 23. Jan 2008
3.687 Beiträge
 
Delphi 2007 Enterprise
 
#1

[MariaDB] Update-Trigger der die selbe Tabelle updaten soll

  Alt 30. Jul 2020, 16:15
Datenbank: MariaDB • Version: 10.? • Zugriff über: UniDAC
Moin!

Ich habe eine Tabelle mit Daten zu Rohstofftanks. Ich möchte nun einen "virtuellen" Tank einfügen, der eine Untergruppe der anderen Tanks als Eins wiederspiegeln soll. Insbesondere den Kombinierten Füllstand. Da wäre an sich ein Trigger ja eine schöne Sache. Leider habe ich das Problem, dass ich den u.s. Trigger zwar erzeugen kann, bei einem UPDATE auf die Tabelle gibt's aber Mecker, weil der Trigger seine eigene Tabelle updaten will. Dass das an sich problematisch ist, leuchtet mir grundsätzlich ein. Durch meinen Code wird zwar sichergestellt, dass es zu keinem Konflikt kommen kann, aber das weiß das DBMS ja nicht.

Mein Trigger so weit:
SQL-Code:
DELIMITER //

DROP TRIGGER IF EXISTS update_T10;

CREATE TRIGGER update_T10 AFTER UPDATE ON tanks FOR EACH ROW
BEGIN
  IF NEW.tank_nr IN (1, 2, 3, 5) THEN
    UPDATE tanks
    SET inhalt = (
      SELECT SUM(inhalt)
      FROM tanks
      WHERE tank_nr IN (1, 2, 3, 5))
    WHERE tank_nr = 10;
  END IF;
END; //

DELIMITER ;
T10 soll also die Summe der Inhalte von T1, T2, T3 und T5 bekommen. Ein Update findet also nicht statt, wenn sich der Inhalt von T10 selbst ändert, sodass kein rekursiver Endlosaufruf passieren kann. Kann ich das dem DBMS irgendwie begreiflich machen? Kann man statt "FOR EACH ROW" vielleicht etwas spezifischer werden?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: [MariaDB] Update-Trigger der die selbe Tabelle updaten soll

  Alt 30. Jul 2020, 16:35
Hallo,
ist MariaDB sowas wie MySQL?

Dann steht hier die Lösung (Stored Procedure nehmen)
https://stackoverflow.com/questions/...e-after-insert
Heiko
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.687 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: [MariaDB] Update-Trigger der die selbe Tabelle updaten soll

  Alt 30. Jul 2020, 16:41
Das ist ein Fork von MySQL bevor es von Oracle übernommen wurde, und wird vom Originalentwickler auch weiter entwickelt. Sehr hübsches DBMSchen.

Darauf war ich auch gestoßen. Leider ist es keine Option für mich, das Update in eine SP zu verpacken, da die Tankfüllstände z.T. von einem Programm geupdated werden, auf das ich keinen Zugriff habe. Und selbst bei denen, die ich selbst update wäre das ein Mega Umbau, da dies mit einer generalisierten Methode passiert, die alle möglichen Werte aus SPSen in Tabellen verteilt - es wäre also die komplette Anlangensteuerung betroffen. Nope.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
jobo

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

AW: [MariaDB] Update-Trigger der die selbe Tabelle updaten soll

  Alt 30. Jul 2020, 18:20
Die Trigger Idee finde ist kritisch. Die "künstliche" Aggregation macht man auch nicht ohne Not.
Statt dessen einfach einen View anlegen
der entweder
den virtuellen Tank als Berechnung darstellt.
oder
den virtuellen Tank und seine "Eltern" gemeinsam darstellt.

Vorteil:
Minimal Invasiv
Null Impact auf das Bestandssystem.
Keine Gefahr, dass ein weiterverarbeitendes System den virtuellen Tank "für voll nimmt"

Nachteil u.U.:
mögliches Performance Problem

OT
mySQL und Maria würde ich nicht als nett bezeichnen, sondern als tükisch und endlosen Quell von Fehlern und Irrtümern.
Gruß, Jo
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.687 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: [MariaDB] Update-Trigger der die selbe Tabelle updaten soll

  Alt 30. Jul 2020, 22:33
Ein View ist eine super Idee! Daran habe ich irgendwie überhaupt nicht gedacht. Danke!

Nachteil u.U.:
mögliches Performance Problem
Kaum. Die Tabelle hat popelige ~60 Zeilen und keine komplexen Felder. Und bevor da Zeilen hinzu kommen, muss der Kunde erstmal eine neue Tankfarm bauen

mySQL und Maria würde ich nicht als nett bezeichnen, sondern als tükisch und endlosen Quell von Fehlern und Irrtümern.
Da würde mich mal interessieren, wieso du das sagst. Wir setzen MySQL/MariaDB seit über 15 Jahren ein, und hatten bislang keine Probleme, die ich mehr oder weniger eindeutig auf die Wahl des DBMS zurückführen könnte. Zugegeben: Wir nutzen fast nur absolute Basisfunktionalität, Trigger schon sehr selten, und ich glaube wir haben ein Mal irgendwo eine SP in ein Live-System gebracht, und auch unsere Abfragen gehen selten über mehr als 4-5 Tabellen (zu bestimmt 90% nur eine). MSSQL hat mir schon erheblich mehr Kopfzerbrechen bereitet, aber das war zu großem Anteil auf einfach dem Fakt geschuldet, dass ich so gut wie keine Erfahrung damit hatte. Insbesondere mit der Administration, die ich bei MariaDB eigentlich recht schlank und wohldokumentiert finde.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
jobo

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

AW: [MariaDB] Update-Trigger der die selbe Tabelle updaten soll

  Alt 30. Jul 2020, 23:06
Gut, Performance bzw. Datenvolumen ist immer relativ. Wenn man auf die Ressourcen bei Webhostern schaut, reichen vielleicht auch kleinere Datenmengen, um ein System an seine Grenzen zu bringen. Im Industrieumfeld eher nicht so ein Problem, außer es geht Richtung Maschinendatenerfassung, IoT usw.

mySQL hat schon lange Probleme (immer?) mit seinen Standardeinstellungen, die bei bestimmten SQL Befehlen dazu führen, falsche Daten auszugeben (Group by..), tückisch, weil man es nur merkt, wenn man handabgezählte Daten einfüllt und das Ergebnis kennt. Alle anderen Systeme, die ich kenne, quittieren derartige Befehle mit Fehlermeldungen. Ein akuter Showstopper aber total safe. In Delphi vergleichbar mit Kompilierfehlern. MySQL bringt in den genannten Fällen "Laufzeitfehler", aber leider ohne Fehlermeldung oder sonstige Hinweise. (etwa so ähnlich: https://www.youtube.com/watch?v=7FeqF1-Z1g0)
Weiter fehlen viele "Standard" Features im Bereich Constraints, es gibt seltsame Limitierungen (z.B. nicht mehr als 61 joins) und eine recht schwache Liste von "Fähigkeiten". Hier irgendwo war gerade z.B. das Thema Geokoordinaten, kann mySQL seit neuestem (Version 8) auch ein wenig, andere Systeme schon "ewig".
mySQL hat seit Oracle in der Weiterentwicklung gelitten (Dauer), bietet dagegen nette Lizenzfallen und es ist für mich ein Rätsel, warum es so häufig benutzt wird.
Wie weit das analog auf Maria zutrifft, kann ich ehrlich nicht sagen. Aber die Systeme sind ja angeblich weitgehend kompatibel ...

Ich würde immer Firebird oder Postgres vorziehen, was ich fast ausschließlich nutze.
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort

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 00:03 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 by Thomas Breitkreuz