/ / oracleで行レベルのトリガーを作成する方法は? - oracle、plsql、triggers、oracle11g

oracleで行レベルのトリガーを作成する方法は? - oracle、plsql、triggers、oracle11g

私は1つのテーブルを持っています hr 呼び出されるスキーマ employee私はこのテーブルに行レベルのトリガーを作成する必要があるので、従業員テーブルの給与を更新しようとすると給与が減ることはありません!

私はこれを試しましたが、私はエラーが発生します:

エラー・レポート:ORA-01748:ここでは単純な列名のみが許可されています。 00000 - "ここでは単純な列名のみが許可されています

CREATE or REPLACE TRIGGER salary_dec_trigger
BEFORE UPDATE OF emp.salary
ON emp
FOR EACH ROW
BEGIN
if(:new.salary>:old.salary)
then

update emp set emp.salary=emp.salary+:new.salary where emp.employee_id=:new.employee_id;
else
rollback;
end if;
END;
/

回答:

回答№1は1
CREATE or REPLACE TRIGGER salary_dec_trigger
BEFORE UPDATE OF salary ON emp
FOR EACH ROW
BEGIN
if(:new.salary < :old.salary) then
raise_application_error(-20001, "Salary can""t be decreased");
end if;
END;

回答№2の場合は0

あなたのコードから、あなたが試みていることを私が知る限り従業員の給与を更新するときはいつでも、前回の給与と実際に合計しますか?給与の引き上げのみを可能にします。

だからこそ、なぜあなたは言う :new.salary = :old.salary + :new.salary?そして、ロールバックをスキップしてください。 :new.salary = :old.salary;

それが機能しない場合は、それを行うために自律型トランザクションを使用してプロシージャを実行する必要がありますが、これは前トリガーが直接行うことができるものですこれをここで確認してください)。