2012-01-03 16 views
0

トリガーについて質問したいと思います。私がテーブルTを持っていて、更新前にトリガーが必要だとしましょう。しかし、私には問題があります。トリガーからTの他の行を使って条件をチェックする必要があります。私の質問は、どのRDBMSがこれをサポートしていますか?トリガーが発生する同じテーブルで選択を実行するトリガーをどこで記述できますか?例えば:同じテーブルのトリガー選択

CREATE TRIGGER updtrigger BEFORE UPDATE ON Employee 
    -> FOR EACH ROW 
    -> BEGIN 
    -> IF NEW.Salary<=500 THEN 
    -> SET NEW.Salary=10000; 
    -> ELSEIF NEW.Salary>500 and NEW.Salary < 600 THEN 
    -> SET NEW.Salary=15000; 
    -> ELSEIF NEW.Salary > (select MAX(Salary) from Employee) 
    -> Set NEW.Salary = 601; 
    -> END IF; 
    -> END 
    -> // 

は、

敬具、

ラヨシュアルパド、ありがとうございました。

+0

これは危険なようで、最高の状態で。私はrdbmsがこれを可能にするかどうか分からない。 'FOR EACH ROW'更新の途中で同じテーブルに対するクエリを許可すると、トリガー内のデータの不一致の可能性が開放されます。行が更新される順序は保証されません。 – rejj

+0

私はこの問題を理解していますが、これは必要になるかもしれません。例えば、いくつかのタイプの矛盾を自動的に取り除きたい場合は、これらのトリガーが必要です。あなたのトリガは、あなたの行が選択なしで他のものと矛盾しているかどうかをどのようにして調べますか?あなたが何をしているのかを知っているなら、これは最高の危険なことではありませんが、何をしているのか分からない人にとっては危険です。 –

答えて

1

与えられたトリガは、たとえば、Oracleで変異表の例外がスローされますが、Oracle内の溶液があり、例えば、このトリガーは許可され、それが正常に動作している:

CREATE or replace TRIGGER updtrigger BEFORE UPDATE ON Employees 
    FOR EACH ROW 
DECLARE 
pragma autonomous_transaction; 
n number; 
    BEGIN 
    select MAX(Salary) into n from Employees; 
    IF :NEW.Salary<=500 THEN 
      DBMS_OUTPUT.PUT_LINE('kisebb mint 500'); 
      :NEW.salary:=n; 
    end if; 
commit; 
    END; 
関連する問題