2016-04-04 2 views
0

が、これは私がトリガで列を識別できないのはなぜですか?私は特定のデータセットのトリガーを作成しようとしています

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 

を使用していたコードであることは言う私にエラーを与える「無効な列名をDateofHire」

次のコードは、動作しますが

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

トリガーコードには何が間違っていますか?

編集:ここで仕事をした別のトリガコードは

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

また、ここで注意してください。 UPDATE関数は、値が同じかどうかを評価しません。その列が元の更新ステートメントに含まれているかどうかを確認するだけです。これは非常に一般的な誤解です。 UPDATE(Salary)は、値が変更されていない場合でもtrueを返します。 –

答えて

0

声明「FROM」トリガーがそれらに有効なTSQLを持っている必要が使用しなくても、です。

これが有効なTSQLではありません。FROM句を指定しない

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

、TSQLはDateOfHireが何であるかを知りません。

+0

しかし、それは給与の列を識別することができます、私は下部に追加したスニペットを別のコードを使用し、それは正常に動作します。プラス私は "ON"ステートメントを使用してテーブルを参照しています、それは動作しませんか?それは私のために、コードの下に働いた。 –

+0

これはUPDATE機能の一部です。このトリガーが更新であると考えてください。つまり、挿入された仮想テーブルと削除された仮想テーブルの両方にDateOfHireがあることを意味します。どのようにあなたが参照しようとしているエンジンも、エンジンがどのように知ることができますか? –

+0

MSDNのUPDATE機能を読んで、それがなぜ機能するのかを理解してください。その機能は、トリガー内のコードの残りの部分には及ばない。最初のCREATE TRIGGERステートメントの "ON"句でテーブルを参照しても、残りのトリガーに対してそのテーブルへの暗黙の参照は自動的に作成されません。あなたがコードの残りの部分でそれを指定しなければならないと私(そしてSean)を信じてください。私は彼らがどのように動作するかを見るために、インターネット上のトリガの例を調べることで恩恵を受けると思います。基本的な原則の誤解があるようです。 –