我想在触发器中实现这样的功能:在删除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;
/
现在我写的触发器当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;
/
已经说明了这个DELETE操作并没有执行成功呀因为违反了引用完整性约束嘛
等其他人来看看吧你的意思是不是说想通过这个触发器来实现这样一个目的:让DELETE操作像没有发生过一样
对吗
是这个意思吧。感觉可以通过条件方式来做的,做操作A之前,加一个条件,先判断一下是否满足了条件,是就做。不是就拉倒。
select count(*) into v_cnt
from emp
where deptno = :old.deptno;
if v_cnt > 0 then
DO A
而不是先自己进行判断是否符合条件那么这样的话正式由DELETE触发了TRIGGER
而楼主现在又想要在TRIGGER中执行操作以实现DELETE没发生过呵呵 怎么感觉有点矛盾了哦
要在delete触发的触发器里取消delete操作,没见过有这么做的而且实现的