[英]Oracle SQL Trigger
我想防止數據庫將任何大於20的值存儲到表中。
CREATE OR REPLACE TRIGGER Dont_Allow
AFTER INSERT ON Cities
FOR EACH ROW
WHEN (new.IDCity > 20)
BEGIN
dbms_output.put_line(' Failed to insert ' || :new.IDCity);
delete from orase where IDCity=:new.IDCity;
END;
盡管這樣做的確有效,實際上並沒有添加任何ID > 20
東西,但是每次觸發器嘗試執行其魔術操作時,這都會顯示:
ORA-04091:表SYSTEM.ORASE正在變異,觸發器/函數可能看不到它
ORA-06512:位於“ SYSTEM.DONT_ALLOW”的第6行
ORA-04088:執行觸發器'SYSTEM.DONT_ALLOW'時出錯
什么是做我想要的正確方法?
我決定為此使用觸發器:
在Employees
插入新行后,觸發器將檢查新Employees
的薪水,如果薪水高於21個單位/小時,則將獲得5%的管理層獎金。 me腳,但是,嘿-我正在使用觸發器來解決我沒有的問題:結果不會很漂亮。
CREATE OR REPLACE TRIGGER Bite_Bonus
AFTER INSERT ON Employees
FOR EACH ROW
WHEN (new.HourSalary > 20)
BEGIN
update Management set Bonus = Bonus - 5/100 * Bonus;
END;
您不應該為此使用TRIGGER
,而應使用CHECK
,例如CONSTRAINT city_id_below_20 CHECK (IDCity < 20)
。 您可以使用ALTER TABLE ADD CONSTRAINT
將其放在現有表上。
如TC1所示,強制執行此類要求的正確方法是使用約束。
如果由於這是一次學校作業而被迫使用劣等方法,那么您很可能想在觸發器中引發異常
CREATE OR REPLACE TRIGGER Dont_Allow
BEFORE INSERT OR UPDATE ON Cities
FOR EACH ROW
WHEN (new.IDCity > 20)
BEGIN
RAISE_APPLICATION_ERROR( -20001, 'IDCity cannot exceed 20 so rejecting invalid value: ' || :new.IDCity );
END;
如果您需要為此使用觸發器,請將其設置為BEFORE INSERT
觸發器,而不是AFTER INSERT
您根本不希望該插入發生。 在事實發生后嘗試“撤消”它不是一個好方法。
要中止插入,您要做的就是在該觸發器內引發異常。 可能最好的辦法是引發應用程序錯誤 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.