簡體   English   中英

Oracle SQL觸發器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM