2016-04-04 13 views
0

ich einen Auslöser für eine bestimmte Datenmenge zu schaffen versuchen, Dies ist der Code, den ichWarum kann mein Auslöser die Spalte nicht identifizieren?

Create trigger tr_minimum_salary 
On tble_SalesReps_TR 
After Update as 
If update(salary) and datediff(YY,DateOfHire,getdate())>=15 
    Begin 
    Raiserror('Employees with more than 15 years of experience cannot recieve less than 100,000 $',0,1) 
Rollback 
Return 
END 

Es ist mir einen Fehler bin mit ‚Ungültiger Spaltenname DateofHire‘ sagt

Während die folgenden Code funktioniert

Select * from tble_SalesReps_TR 
    Where datediff(YY,DateOfHire,getdate())>=15 

Was mache ich falsch mit dem Triggercode?

EDIT: Hier ist ein weiterer Trigger-Code, die Arbeit getan hat, ohne die

"FROM" Anweisung verwenden
Create trigger tr_nochange_december 
    On tbls_products_tr 
    After Update as 
    If update(UnitsOnOrder) and datepart(m,(getdate()))<>12 
    Begin 
    Raiserror('These products can only be purchased in December',0,1) 
    Rollback 
    Return 
    END 
+0

Auch hier vorsichtig sein. Die UPDATE-Funktion wird NICHT ausgewertet, wenn die Werte identisch sind. Es wird nur überprüft, ob diese Spalte in der ursprünglichen Update-Anweisung enthalten ist. Dies ist ein sehr häufiges Missverständnis. UPDATE (Gehalt) gibt True zurück, auch wenn der Wert unverändert ist. –

Antwort

0

Trigger hat in ihnen gültige TSQL haben.

Dies gilt nicht TSQL:

If update(salary) and datediff(YY,DateOfHire,getdate())>=15 

Ohne FROM Klausel, TSQL nicht weiß, was DateOfHire ist.

+0

Aber es ist in der Lage, die Gehaltsspalte zu identifizieren, habe ich einen anderen Code verwendet ein Schnipsel von denen ich im unteren Teil hinzugefügt habe, funktioniert es gut. Plus ich verweise auf die Tabelle mit einer "ON" -Anweisung, funktioniert das nicht? Es funktionierte für mich mit dem Code unten. –

+0

Das ist Teil der UPDATE-Funktionalität. Bedenken Sie, dass dieser Auslöser ein Update ist. Das bedeutet, dass Sie DateOfHire sowohl in den eingefügten als auch in den gelöschten virtuellen Tabellen haben. Wie könnte die Engine möglicherweise wissen, auf welche Sie sich beziehen möchten? –

+0

Bitte lesen Sie über die UPDATE-Funktion in MSDN und verstehen Sie, warum es funktioniert. Die Funktionalität erstreckt sich nicht auf den Rest des Codes im Trigger. Die Tatsache, dass Sie in der Klausel "ON" der ursprünglichen CREATE TRIGGER-Anweisung auf die Tabelle verweisen, erstellt für den Rest des Triggers nicht automatisch eine implizite Referenz auf diese Tabelle. Glauben Sie mir (und Sean), dass Sie es im Rest des Codes angeben müssen. Ich denke, Sie würden davon profitieren, einige Beispiele von Triggern im Internet nachzuschlagen, um zu sehen, wie sie funktionieren. Sie scheinen ein paar Missverständnisse über ihre Grundprinzipien zu haben. –

Verwandte Themen