如何在oracle中创建一个触发器,如果​​satrt date早于当前日期,将确保不删除任何记录?

时间:2012-03-12 06:23:39

标签: sql oracle sqlplus

我有一张桌子电影。

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 date早于当前日期则不会删除任何记录。 我的触发器代码是 -

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;

触发器已创建。当我执行此代码以删除数据时 -

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' 

我想摆脱这个错误。

2 个答案:

答案 0 :(得分: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 :(得分:1)

在删除语句中添加异常处理。

您需要做的就是在其自己的BEGIN和END块中编写delete语句,并处理从触发器抛出的异常。如果符合条件,则不会删除任何行;但是,将使用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开发人员中得到的输出。

  

无法删除记录。

我希望它有所帮助。