我想在触发器中实现这样的功能:在删除dept部门表时,判断该部门号deptno是否存在于引用该字段值的emp表(通过外键约束)中,如果存在,则给出提示信息,并中止删除操作,如果不存在,则执行删除操作。
    现在我写的触发器当deptno被引用时,并不会中止delete操作,仍然会弹出系统错误信息:ORA-02292: 违反完整约束条件 (SCOTT.FK_DEPTNO) - 已找到子记录
    该怎么实现中止删除的操作呢?请大家帮帮忙,谢谢!触发器代码如下:
create or replace trigger dept_line_delete
  before delete on dept
  for each row
declare 
  v_cnt number;
  e_has exception;
begin
  select count(*) into v_cnt
    from emp
    where deptno = :old.deptno;
  if v_cnt > 0 then
    raise e_has;
  end if;
exception
  when e_has then
    dbms_output.put_line('错误,该部门还存在员工!');  
end dept_line_delete; 
/

解决方案 »

  1.   

    弹出错误消息ORA-02292: 违反完整约束条件 (SCOTT.FK_DEPTNO) - 已找到子记录 
    已经说明了这个DELETE操作并没有执行成功呀因为违反了引用完整性约束嘛
      

  2.   

    我就是不想弹出这个错误,因为触发器是在delete前触发的,我希望能够中止delete操作
      

  3.   

    这个…… 暂时想不出什么方法
    等其他人来看看吧你的意思是不是说想通过这个触发器来实现这样一个目的:让DELETE操作像没有发生过一样 
    对吗
      

  4.   

    触发器能在操作A之前触发一个操作B,或操作A之后触发一个操作C。(在操作之前 before trigger 或之后 after trigger),LZ的意思好像是如果不满足条件。直接能够阻止操作A。
    是这个意思吧。感觉可以通过条件方式来做的,做操作A之前,加一个条件,先判断一下是否满足了条件,是就做。不是就拉倒。
    select count(*) into v_cnt 
        from emp 
        where deptno = :old.deptno; 
      if v_cnt > 0 then 
      DO A
      

  5.   

    可是我感觉楼主的意思是他直接执行DELETE FROM TABLE_NAME...
    而不是先自己进行判断是否符合条件那么这样的话正式由DELETE触发了TRIGGER 
    而楼主现在又想要在TRIGGER中执行操作以实现DELETE没发生过呵呵 怎么感觉有点矛盾了哦
      

  6.   

    如果要实现这个要求,一般是delete前先判断一下
    要在delete触发的触发器里取消delete操作,没见过有这么做的而且实现的
      

  7.   

    其实,如果一定要是通过触发器来实现,也可以变通这一方法的方法;在before前先去delete掉emp表对应的数据,删除掉dept的资料,并把它们数据保存起来,after delele 之后再判断是否有保存emp表的资料,如果有资料的话,再做一下undo(也就是insert into回原表).这样也可以,不过这样的操作使问题变的复杂了。再delete前先去判断的做法比较好。