2012-03-12 28 views
2

我有一張桌子電影。如何在oracle中創建觸發器,以確保在satrt日期早於當前日期的情況下不會刪除任何記錄?

create table Movie 
(
mv_id number(5), 
mv_name varchar2(30), 
startdate date 
) 
insert into Movie values(1,'AVATAR','8-MAR-2012'); 
insert into Movie values(2,'MI3','20-MAR-2012'); 
insert into Movie values(3,'BAD BOYS','10-Feb-2012'); 

我想創建一個觸發器,確保沒有記錄被刪除如果satrt日期早於當前日期。 我的觸發代碼 -

create or replace trigger trg_1 
before delete 
on Movie 
for each row 
when(old.startdate < sysdate) 
begin 
raise_application_error(-20001, 'Records can not be deleted'); 
end; 

扳機created.When我執行該代碼刪除數據 -

delete from Movie where mv_id=1; 

隨後引發火災,但有錯誤,我不知道爲什麼我收到這樣的錯誤。 我不想要任何錯誤,我只想要消息。 這是錯誤 -

delete from Movie where mv_id=1 
      * 
ERROR at line 1: 
ORA-20010: Records can not be deleted 
ORA-06512: at "OPS$0924769.TRG_1", line 3 
ORA-04088: error during execution of trigger 'OPS$0924769.TRG_1' 

我想擺脫這個錯誤。

+0

要只顯示:'記錄不能刪除' – Vikram 2012-03-12 06:36:50

+0

我想要防止刪除並顯示一條消息。 – user1262375 2012-03-12 06:45:57

回答

5

表上的觸發器防止任何操作的唯一方法是拋出異常。您不能有防止DELETE並打印消息的觸發器。

你可以寫試圖顯示的消息觸發,並允許刪除發生

create or replace trigger trg_1 
    before delete 
    on Movie 
    for each row 
    when(old.startdate < sysdate) 
begin 
    dbms_output.put_line('Records can not be deleted'); 
end; 

如果客戶碰巧被配置爲顯示寫入DBMS_OUTPUT緩衝區中的數據(大多數客戶不會),這將顯示一條消息。但它也將允許刪除成功,這聽起來不像你想要的。

1

在刪除語句中添加異常處理。

您只需將delete語句寫入其自己的BEGIN和END塊中,並處理從觸發器拋出的異常。如果條件與條件匹配,則不會刪除任何行;但是,拒絕刪除記錄的消息將使用DBMS_OUTPUT命令顯示。

下面的代碼你想要做什麼:

BEGIN 
DELETE FROM MOVIE WHERE MV_ID = 1; 

EXCEPTION 
    WHEN OTHERS 
    THEN DBMS_OUTPUT.PUT_LINE('Records can not be deleted.'); 

END; 

您可以檢查在輸出窗口中的消息。以下是執行上述查詢塊後在PL/SQL開發人員中獲得的輸出。

記錄無法刪除。

我希望它有幫助。

相關問題