2016-05-24 2 views
0

テーブル(従業員)にトリガーを実装する必要があります。トリガーは、単純な従業員が自分の部門のマネージャーよりも高い給与を得たときにトリガーする必要があります。 そして私はこれをしました。SQL TRIGGERSデータベース

CREATE TRIGGER sal on EMPLOYEE 

AFTER INSERT,UPDATE 
as 
declare @sal int; 
declare @sal_mgr int; 
declare @sal_manager TABLE(sal int) 

SELECT @sal = salary FROM EMPLOYEE 

SELECT @sal_mgr = salary FROM EMPLOYEE join Department on ssn = mgr_ssn where dno=dnumber 

INSERT INTO @sal_manager values (@sal_mgr) 

UPDATE EMPLOYEE SET salary = @sal_mgr-1 where salary >= @sal_mgr 

しかし、これで私は1人のマネージャーの給料ではなく、私はさまざまな部門を持っているすべてを取得(そのだけで各部門の1つのマネージャを許さ)

+0

1人の従業員は1人のマネージャしか持っていませんか?どの他のマネージャーの給与が重要なのでしょうか? – oerkelens

+0

各従業員には1人のマネージャーしかいませんが、マネージャーには多くの従業員がいます。このコードは常に同じマネージャーの給与を得ており、各従業員を給与と比較しています。彼らの部局のマネージャーではありません –

+1

私は上記がまったく実行されているのに驚いています!複数のステートメントがありますが、begin-end構造はありません。 – Shadow

答えて

1

あなたのコードを持つ2つの主要な問題があります。

  1. 私はコメントで述べたように、あなたは(明らかに)トリガー内の複数のSQLコマンドを持っていませんが、BEGIN ... END構造をトリガーに属する文の開始と終了をマークするために何があります。あなたのコードは、mysqlのcreate trigger syntaxにも準拠していません。

  2. 含まれているSQLクエリは更新された/挿入されたレコードに対して実行されず、テーブル全体で実行されます。これは、コードが同じマネージャとすべてのものを比較する理由を説明します。クエリの結果セットの最後のマネージャです。挿入/更新されたレコードのフィールドは、NEWキーワードを使用してアクセスすることができます

examples in mysql documentationを参照)

SELECT @sal = salary FROM EMPLOYEE; -> not required, it is simply NEW.salary 

SELECT @sal_mgr = salary FROM EMPLOYEE join Department on ssn = mgr_ssn where dno=dnumber; 

上記は単純に(それがあるので、フィールドがするテーブル属しているいくつかの仮定を行うべきです

上記のロジックに基づいて他のすべてのクエリを書き換えることができます+ plsは適切なmysqlを使用しますトリガーを作成し、begin - endブロックを使用するためのyntax。