SQL 2008R2 Express - Trigger für insert/update

bw1980

Benutzer
Beiträge
10
Hallo Community,

ich bin ein IT'ler, jedoch kein Spezialist für SQL Server und Trigger.
In meinem Unternehmen verwenden wir eine Software für Lager-/Bestandsbuchungen.
Als DB wird eine SQL Server 2008 R2 Express DB angesprochen.
Nun zu meinem Problem - trotz intensivstem Suchen über Google und co. komme ich auf kein Ergebnis.
Es soll:
nachdem eine Entnahme im Lager getätigt wird, schreibt unsere Lagersoftware alle Informationen (Transaktionsnummer (fortlaufend), Datum, Uhrzeit, Anwender, Artikel, Menge, usw. in eine Tabelle (klar, wo sonst...)
Nun möchte ich den letzten, aktuellen Wert (also die letzte Transaktion) aus der Tabelle auslesen (hier benötige ich lediglich zwei Werte aus zwei Spalten, die Anwendernummer und den Transaktionscode), über diese Anwendernummer möchte ich in der Tabelle der Anwender (wo auch die Anwendernummer geführt wird) den Transaktionscode abändern.


Soweit ich es verstanden habe, muss der Trigger nach einem "INSERT" ausgeführt werden.

Weiter als:

CREATE TRIGGER [dbo].[trg_test] ON [dbo].[TransactionLog]
AFTER INSERT
...............
Komme ich mit meinem Latein nicht.

Daten Quelle
Name Transaktionstabelle (Quelltabelle):
TransactionLog
Name Spalte Anwendernummer in der Quelltabelle:
USERNUMBER, NVARCHAR, max. 32 Zeichen
Name Spalte Transaktionscode in der Quelltabelle:
TRANSCODE, NVARCHAR, max. 3 Zeichen
BEDINGUNG: nur Werte mit "WN" oder "RN" sollen angesprochen werden. Stehen andere Werte dring "DD", "WDK", usw. dann soll nichts unternommen werden.

Daten Ziel
Name Anwendertabelle (Zieltabelle):
UserTransactions
Name Spalte Anwendernummer in der Zieltabelle:
USERNUMBER, NVARCHAR, max. 32 Zeichen
Zu ändernder Wert in der Zieltabelle (Spaltenname "TRANSCODE", NVARCHAR, max. 3Zeichen )
von "WN" auf "RN" und umgekehrt, steht ein "RN" so soll es auf "WN" geupdatet werden.

Fragt nicht nach dem Sinn des Ganzen. Aufgabe von oben.
Für jede Lösung bin ich jetzt schon dankbar. Gehe erst mal ins Bett, heute ab 7:00 ist auch wieder ein Tag.
Grüße an die Gemeinde!
 
Werbung:
Code:
CREATE TRIGGER [dbo].[trg_test] ON [dbo].[TransactionLog]
AFTER INSERT
AS

BEGIN
   SET NOCOUNT ON;

   UPDATE   UserTransactions
   SET     UserTransactions.TRANSCODE = i.TRANSCODE
   FROM   UserTransactions
   INNER JOIN INSERTED i
   ON     UserTransactions.USERNUMBER = i.USERNUMBER
   WHERE   i.TRANSCODE IN ( 'WN','RN' )
END;
 
Habe es geprüft, es funktioniert leider nicht.
Habe den Express Profiler ausgeführt, beim Insert in die Transactionlog (Quelltabelle) wird ein
Event Class RPC: Completed
Text Data: exec sp_executesql N'INSERT INTO transactionlog (......
erzeugt.
Was kann ich noch tun/welche Infos werden benötigt?
 
Also eine Fehlermeldung beim CREATE oder beim INSERT kommt nicht, die Spalte in der Zieltabelle bleibt nur leer oder wie?

Du kannst den Trigger mal so anlegen:
Code:
CREATE TRIGGER [dbo].[trg_test] ON [dbo].[TransactionLog]
AFTER INSERT
AS

BEGIN
SET NOCOUNT ON;

SELECT
UserTransactions.USERNUMBER,
UserTransactions.TRANSCODE,i.TRANSCODE
FROM UserTransactions
INNER JOIN INSERTED i
ON UserTransactions.USERNUMBER = i.USERNUMBER
END;
Und dann per Management Studio einen INSERT auf die Quell-Tabelle machen. Er müsste dir aus dem INSERT genau die 3 Werte anzeigen.
 
Nein, es kommt keine Fehlermeldung. In der Zieltabelle gibt es schon die beiden Spalten USERNUMBER und TRANSCODE.
Es befindet sich bereits der User drin mit z.B. Wert WN in der Spalte TRANSCODE.
Nun möchte ich die letzte eingefügte Transaktion aus der TRANSACTIONLOG prüfen, sehen, ob ein WN oder RN drin steht.
Befindet sich hier ein WN so möchte ich in der Zieltabelle USERTRANSACTIONS diesen umkehren, d.h. aus WN einen RN "machen" und ein RN zu einem WN umschreiben.
 
Habe nochmal geschaut und Dein SELECT ausgeführt.
Ergebnis in der Zieltabelle:
3 Spalten, USERNUMBER, TRANSCODE, TRANSCODE.
1 Spalte "TEST", 2 Spalte "WN", 3 Spalte "WN"
 
jetzt habe ich das am SQL Server ausgeführt:

CREATE TRIGGER [dbo].[trg_test] ON [dbo].[TransactionLog]
AFTER INSERT
AS

BEGIN
SET NOCOUNT ON;

UPDATE UserTransactions
SET UserTransactions.TRANSCODE = 'RN'
END;

und in der Zieltabelle wurde das 'WN' auf 'RN' geändert. Im Endeffekt bräuchte ich ein Automatismus:
Quelltabelle TRANSCODE = WN - ändere in der Zieltabelle den TRANSCODE =RN
Quelltabelle TRANSCODE = RN - ändere in der Zieltabelle den TRANSCODE =WN
Hoffe, es ist soweit alles klar beschrieben von meiner Seite.
Danke sehr für die Unterstützung
 
Also wenn ich dich richtig verstehe willst du:
Code:
CREATE TRIGGER [dbo].[trg_test] ON [dbo].[TransactionLog]
AFTER INSERT
AS

BEGIN
   SET NOCOUNT ON;

   UPDATE   UserTransactions
   SET     UserTransactions.TRANSCODE = ( CASE WHEN i.TRANSCODE = 'WN' THEN 'RN' ELSE 'WN' END )
   FROM   UserTransactions
   INNER JOIN INSERTED i
   ON     UserTransactions.USERNUMBER = i.USERNUMBER
   WHERE   i.TRANSCODE IN ( 'WN','RN' )
   AND     UserTransactions.TRANSCODE IN ( 'WN','RN' )
END;
Wenn in TransactionLog ein Eintrag mit WN geschrieben wird und der User in UserTransactions ein RN stehen hat soll RN in WN umgeschrieben werden. Das gleiche umgekehrt.
 
Hallo zusammen, das oben beschrieben funktioniert einwandfrei - Ukulele, nochmal danke dafür!
Darüber hinaus hätte ich noch gerne (kann im gleichen Trigger eingebaut sein oder ein separater erstellt werden):

Beschreibung
Ein Anwender entnimmt ein Teil. Dazu wird in der [dbo].[TransactionLog] als Transcode "WN" geschrieben.
Gleichzeitig erstellt unsere Software in der [dbo].[ActInv] eine Zeile (nur und genau eine), auf welche Kostenstelle usw. ein Teil entnommen wurde.
Es wird immer weniger zurückgegeben als entnommen wurde (Rückgabe geschieht mit dem Transcode "RN"), deswegen soll nach dem RN in der [dbo].[TransactionLog] danach in der [dbo].[ActInv] die Zeile des Anwenders gelöscht werden, da eine gewisse Menge verbraucht wurde und diese nicht mehr zurückgegeben wird.
Hierzu kann (oder ist) die Spalte USERNUMBER (NVARCHAR, max. 32 Zeichen) gleich in allen Tabellen:
[dbo].[ActInv]
[dbo].[TransactionLog]
[dbo].[UserTransactions]

Hoffe, Ihr könnt mir helfen. Herzlichen Dank dafür!
 
Das ist mir noch nicht ganz klar. Mein Triggercode schreibt ja in UserTransactions den Transcode, du willst jetzt aber, wenn ich das richtig verstehe, TransactionLog überwachen und bei gewissen Ereignissen in ActInv Änderungen durchführen. Sehe ich das richtig? Ist dann nicht eigentlich UserTransactions für diesen Fall irrelevant?

Und wie sind die Informationen verknüpft? Wenn ein WN in der TransactionLog erfolgt habe ich zwar die USERNUMBER, aber können nicht auf die USERNUMBER mehrere gleichzeitige oder mehrere nicht abgeschlossene Vorgänge kommen? Oder ist USERNUMBER wirklich eindeutig was den Vorgang angeht?
 
1. Dein Triggercode funktioniert super. Das Transaktionsrecht wird umgekehrt, TOP!
2. Ja, sobald ein RN in der TransactionLog geschrieben wird soll der zugehörige Eintrag in der ActInv gelöscht werden. Die USERNUMBER ist eindeutig, da nach einer Entnahme immer zurückgegeben werden muss, d.h. es werden keine mehreren Zeilen in der ActInv für die gleiche USERNUMBER eingetragen.
Die UserTransactions ist relevant, dass soll so bleiben wie es jetzt funktioniert.

Im Endeffekt ist der Ablauf so:
- FUNKTIONIERT: Entnahme eines Artikels über WN (z.B. 500 Stück), danach wird über Deinen Trigger aus dem WN Transaktionsrecht ein RN, so dass wenn sich der Anwender neu anmeldet, er zurückgeben MUSS
- FUNKTIONIERT: Dabei wird eine Zeile in der ActInv als "offen für Rückgabe" vermerkt (500 Stück) - User, Artikel, usw.
- FUNKTIONIERT: Rückgabe eines Artikels über RN (dann weniger, z.B. 300 Stück)
- FEHLT: Löschung der verbleibenden "offenen Menge" von 200 Stück in der ActInv, bezogen auf die gleiche USERNUMBER
- FUNKTIONIERT: Nach der Rückgabe soll in der UserTransactions das RN in WN umgeschrieben werden (funktioniert mit Deinem Trigger)

Habe es selbst versucht, funktioniert aber nicht. Für jegliche Hilfe (Umbau des vorhandenen Triggers, ein zweiter Trigger) bin ich sehr dankbar.
Gute Nacht zusammen.
 
Klingt einfach nur zwei Frage noch zum Ablauf:

1) In welcher Reihenfolge läuft das ab? Wenn TRANSCODE = RN gesetzt wird, stehen dann schon die restlichen 200 Stück in ActInv oder wird das erst danach gesetzt? Wenn ich die Zeile nämlich komplett lösche, vermisst sie eventuell die Anwendung wenn sie sie auf 200 Stück runter setzen will.
2) Gibt es eventuell ein festes Verhältnis zwischen Ausgabe und Rückgabe oder variieren die Mengen?
 
Werbung:
Super!

1) Ich glaube, es wird gleichzeitig gesetzt. Was aber zuerst geschieht (TransactionLog oder ActInv) - das kann ich leider nicht sagen. Glaube, ActInv wird nach abgeschlossenem Eintrag in der TransactionLog geschrieben.
2) Leider nicht, es wird unterschiedlich entnommen und unterschiedlich zurück gegeben, hier gibt es keine festen Werte

1.000 Dank für Deine Hilfe!
 
Zurück
Oben