मेरे पास एक टेबल है hr
स्कीमा कहा जाता है employee
, मुझे इस तालिका पर पंक्ति स्तर ट्रिगर बनाने की जरूरत है ताकि जब भी मैं कर्मचारी तालिका पर वेतन अपडेट करने का प्रयास करता हूं, तो मैं सुनिश्चित करता हूं कि वेतन कम नहीं किया जायेगा!
मैंने यह कोशिश की है लेकिन मुझे एक त्रुटि मिलती है:
त्रुटि रिपोर्ट: ओआरए -01748: 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 के लिए 1CREATE 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;
जवाब के लिए 0 № 2
जहां तक मैं आपके कोड से बता सकता हूं कि आप कोशिश कर रहे हैंजब भी आप किसी कर्मचारी के लिए वेतन अपडेट करते हैं तो आप वास्तव में इसे अपने पिछले वेतन के साथ जोड़ देंगे, है ना? और केवल वेतन में वृद्धि की अनुमति दें, कभी कमी न करें।
तो आप बस इतना क्यों नहीं कहते हैं :new.salary = :old.salary + :new.salary
? और रोलबैक छोड़ें, बस करें :new.salary = :old.salary
;
यदि यह काम नहीं करता है तो आपको ऐसा करने के लिए एक स्वायत्त लेनदेन के साथ एक प्रक्रिया का प्रयास करना चाहिए, लेकिन यह है कि ट्रिगर से पहले आपको सीधे करने की अनुमति देनी चाहिए (इसे यहां देखें)।