2016-08-12 3 views
-1

Ich habe noch nie wirklich mit Triggern in MSSQL gearbeitet, aber ich denke, es wird das sein, was ich für diese Aufgabe brauche.Spaltenwert nach INSERT ändern, wenn der Wert den Kriterien entspricht?

Die Struktur der Tabelle ist als solche:

ID|****|****|****|****|****|****|****|TOUROPERATOR 

Die Tour Operator Code ist der Code, der uns sagt, was Unternehmen den Flug im Besitz wir für sie durchgeführt wird. Zwei dieser Codes (insgesamt 24) sind veraltet. Unsere Benutzer haben angefordert, dass diese beiden geändert werden, aber der Reiseveranstalter-Code wird aus einer Datenbank gezogen, die wir nicht kontrollieren. Die FlightData-Tabelle steuern wir jedoch. Ich dachte also, ein Auslöser könnte den Reiseveranstaltercode ändern, wenn er einer der beiden veralteten ist, und zwar zu den richtigen, bzw. wenn sie eingefügt wurden.

Also ging ich in gutes altes SQL Management Studio und fragte nach einem Trigger. Es gab mir einige Code-Beispiel und hier ist mein Pseudo-Code unten:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TRIGGER ChangeProvider 
ON FlightData 
AFTER INSERT 
AS 
BEGIN 
    IF(TheInsertedValue == Criteria) 
     UPDATE FlightData 
     SET TheInsertedValue = NewValue 
    ENDIF 
END 
GO 

Ich bin nicht so gut mit dieser Art von Datenbankprogrammierung so meine Fehler entschuldigen.

Wie würde ich das machen?

+0

Mögliche Duplikat von [Wie kann ich Werte eines INSERT in einem Trigger bearbeiten auf SQL Server?] (Http://stackoverflow.com/questions/3580123/how-can-i-edit-values-of-an-insert-in-a-trigger-on-sql-server) –

+0

Warum aktualisieren Sie die Tabelle nach dem Einfügen? Warum nicht den Code des Reiseveranstalters vor dem Einfügen bearbeiten und den richtigen Anbietercode eingeben? –

+0

Da der Code aus einer Datenbank gezogen wird, kontrollieren wir nicht. Wir haben nur Sichtzugriff auf diese Datenbank, wir können sie nicht manipulieren. – OmniOwl

Antwort

1

Sie könnten eine berechnete Spalte zu Ihrer Tabelle hinzufügen, anstatt einen Auslöser hinzuzufügen. Dann könnte die neue Spalte einfach eine case-Anweisung verwenden, um entweder den ursprünglichen TourOperator-Spaltenwert oder den neuen gewünschten Wert anzuzeigen.

Sie würden eine neue Spalte zu Ihrer Tabelle wie folgt

TourOperatorCorrect = CASE WHEN TourOperator = 'Whatever value' THEN  'ChangedValue' 
         --I just want to use what I have already in the TourOperator column 
         ELSE TourOperator 
         END AS VARCHAR(50) 

Grundlagen der berechneten Spalten hinzufügen, sind hier - https://msdn.microsoft.com/en-ie/library/ms188300.aspx

+0

Von dem, was ich sammle, müsste ich die Spalte löschen, voller Daten, und dann eine neue Spalte daneben machen ._. – OmniOwl

+0

Sie können die TourOperator-Spalte beibehalten, indem Sie der Tabelle eine weitere virtuelle Spalte (sie können beibehalten werden) hinzufügen, die Ihren "sauberen" Wert enthält, entweder den ursprünglichen TourOperator-Wert oder den neuen Wert. – TheGaff

+0

Also würde ich die berechnete Spalte abfragen, anstatt die ursprüngliche oder? – OmniOwl

0

Ihr Missverständnis hier ist, dass der Trigger einmal pro eingefügtem Wert ausgeführt wird - es wird tatsächlich einmal pro Insert-Anweisung ausgeführt, so dass Sie mehr als eine Zeile auf einmal einfügen können.

Sie werden feststellen, dass Ihre eingefügten Werte in der Pseudo-Tabelle inserted enthalten sind, die in diesem Fall die gleiche Struktur wie Ihre FlightData-Tabelle hat. Sie schreiben eine Select-Anweisung dagegen und geben dabei alle gewünschten Kriterien an.

Es ist jedoch nicht sofort klar, was Ihre Logik ist - hat die FlightData Tabelle, die Sie in Ihrem Auslöser aktualisieren, nur eine Zeile? Aktualisieren Sie jede Zeile in der Tabelle mit dem neuesten eingefügten Wert? Es ist schwer zu verstehen, was Sie jetzt versuchen, und was der Zweck der Tabelle und dieser Auslöser ist - geschweige denn, was Sie tun möchten, wenn Sie mehr als eine Zeile gleichzeitig einfügen würden.

+0

Die Tabelle FlightData hat hunderttausende Zeilen, aber zwei der von uns verwendeten Reiseveranstaltercodes wurden von unseren Benutzern angefordert, wenn sie Daten aus dieser Tabelle abrufen. Die Reiseveranstaltercodes werden jedoch aus einer externen Datenbank abgerufen, die wir nicht kontrollieren. Wir können es nicht manipulieren. Also, was ich dachte, war, einen Einsatz zu fangen und einfach die Reiseveranstaltercodes so zu ändern, dass sie in der FlightData-Tabelle korrekt angezeigt werden. – OmniOwl

0

Wenn eingefügt Tabelle mutiple Zeilen enthält, wird Ihr Code fehlschlagen, so Code ändern mit eingesetztem Tabelle zu arbeiten, wie ganze

UPDATE F 
    SET f.TheInsertedValue = i.value 
    from inserted i 
    join 
    Flighttable F 
    on f.matchingcolumn=i.matchingcolumn 
    and i.somevalue='criteria' 
Verwandte Themen