SQL automatische Datum und Trigger

deny47

Neuer Benutzer
Beiträge
2
Hallo alle zusammen,

Ich habe einen Trigger erstellt, der die automatische Uhrzeit in die Spalte Datum einfügt, sobald eine Aktualisierung im Textfeld Kommentare erfolgt.

Das Problem dabei ist, dass es ständig alle bereits durchgeführten Updates überschreibt. Es sollte das automatisch gesetzte Datum nur dem jeweiligen Artikel hinzufügen, der gerade ausgeführt / geupdated wird.

Kann mir da jemand weiterhelfen und den Code entsprechend anpassen?

ALTER TRIGGER [dbo].[Uhrzeit_trigger]
ON [dbo].[Artikel]
AFTER UPDATE
AS
BEGIN
Update dbo.Artikel
SET Datum = GETDATE()
WHERE Bemerkung IN (Select Distinct Bemerkung FROM Artikel)
END

Wenn ich nun ein Update auf die Artikelnummer 888 mit dem Text Hallo durchführe, erscheint das Datum 27.12.2022 mit der Uhrzeit 11:00 Uhr.

Wenn ich ein weiteres Update mit der Artikelnummer 999 mit dem Text Bye durchführe, erscheint das Datum 27.12.2022 mit der Uhrzeit 12:35 Uhr.

Das Problem dabei ist, dass das Datum für den Artikel 888 jetzt auch 12:35 Uhr ist. Diese sollte jedoch nicht überschrieben werden.

So sollte es nach einem Update eines anderen Artikels sein:

KundennummerArtikelnummerBemerkungDatum
1111888Hallo27.12.2022 11:00
1111999Bye27.12.2022 12:35

So ist es aktuell nach dem Update eines Artikels:

KundennummerArtikelnummerBemerkungDatum
1111888Hallo27.12.2022 12:35
1111999Bye27.12.2022 12:35
 
Werbung:
Man macht solche Updates in einem Trigger tunlichst per Primary Key.
Deine Where Clause ist außerdem in sich falsch, weil sie eine Bedingung stellt, die (fast) immer wahr ist.
Der Sinn Deiner Where Bedingung erschließt sich nicht. Dir ist klar, dass bei korrektem Trigger und nicht eindeutigen Bemerkungen ebenfalls mehrere Datensätze aktualisiert würden?
In Deinem Fall musst Du offenbar Kundennummer und Artikelnummer als Aktualisierungskriterium nutzen.
 
Nein, kann ich Dir nicht geben, ich kenne mich mit MSSQL nicht so gut aus, weil ich es niemals nutzen würde.
Du müsstest vielleicht mal etwas im Handbuch lesen oder irgendwo ein Tutorial suchen und verstehen, wie man es macht inkl. der Dinge, die Du (konzeptionell) falsch machst.
Technisch würde die Where Clause z.B. ungefähr so aussehen, aber ich weiß nicht, ob MSSQL das kann:
Code:
WHERE (Kundennummer, Artikelnummer) IN (SELECT DISTINCT Kundennummer, Artikelnummer FROM Inserted)
Der Weg über "inserted" ist meines Wissens nach schon sehr MS spezifisch und nicht unbedingt typisch oder Standard. Aber es gibt hier Spezialisten für MSSQL, die das sicher besser erklären können.
 
Hallo alle zusammen,

Ich habe einen Trigger erstellt, der die automatische Uhrzeit in die Spalte Datum einfügt, sobald eine Aktualisierung im Textfeld Kommentare erfolgt.

Das Problem dabei ist, dass es ständig alle bereits durchgeführten Updates überschreibt. Es sollte das automatisch gesetzte Datum nur dem jeweiligen Artikel hinzufügen, der gerade ausgeführt / geupdated wird.



Versuch einfach mal zu verstehen, was Du da tust. Hilfreich dazu könnte ein SELECT mit Deiner WHERE-Condition sein. Ich habe/nutze kein M$SQL, aber in PostgreSQL würde ich dazu einen BEFORE UPDATE - Trigger nutzen, um das Feld NEW.datum zu manipulieren.
 
Hallo,
also der Trigger wird nicht nur bei Änderungen des Kommentars feuern sondern bei jeder Änderung am Artikel. Und aufgrund der WHERE Klausel werden alle Artikel den selben Zeitstempel erhalten.

Hast du eine Möglichkeit das UPDATE Statement selbst zu bearbeiten statt über einen Trigger zu gehen?
(Mein Kollege pflegte immer zu sage: Trigger sind böse)
 
Du brauchst doch dafür gar keinen Trigger. Das geht auch ohne.
Das wäre ja super, wieso schreibst Du nicht ein Stichwort zu diesem Weg?
(Mein Kollege pflegte immer zu sage: Trigger sind böse)
Naja, das kann man differenzierter betrachten. Trigger sind intransparent und mglw. mit viel undurchsichtiger Logik vollgestopft.
Ich würde sagen, für solche Zwecke ist ihre Nutzung sehr angemessen. Es geschieht ja in diesem Fall nichts geheimnisvolles/intransparentes.
 
Werbung:
Der Trigger ist totaler Murks.

Poste mal bitte die Tabellendefinition oder zumindest die des PRIMARY KEYs. Findest du im SSMS auch unter Tabelle \ Schlüssel.

Das kann dann in etwa so aussehen:
Code:
ALTER TRIGGER [dbo].[Uhrzeit_trigger]
ON [dbo].[Artikel]
AFTER UPDATE
AS
BEGIN
UPDATE dbo.Artikel
SET Artikel.Datum = GETDATE()
FROM dbo.Artikel
INNER JOIN INSERTED
ON Artikel.primarykey = INSERTED.primary
END
 
Zurück
Oben