Oracle11g 通过触发器删除的引用完整性约束

Oracle11g 通过触发器删除的引用完整性约束,oracle11g,triggers,Oracle11g,Triggers,我有三张桌子 病人 依赖的 病人探视 “患者表”的主键在“家属”和“患者就诊”表中用作外键。我需要patient table上的触发器,它在删除之前检查子表中的patient_id。 至于现在,我已经创建了一个触发器,但它不起作用 create or replace trigger deletePatient before delete on patient for each row declare v_count number(5); v_count

我有三张桌子

  • 病人
  • 依赖的
  • 病人探视
  • “患者表”的主键在“家属”和“患者就诊”表中用作外键。我需要patient table上的触发器,它在删除之前检查子表中的patient_id。 至于现在,我已经创建了一个触发器,但它不起作用

    create or replace trigger deletePatient 
    before delete on patient 
    for each row 
    declare     
           v_count number(5);
           v_count1 number(5); 
    begin
         select count(patient_id)   
         into v_count   
         from dependent     
         where patient_id = :old.patient_id;
    
         if v_count > 0 then 
                     raise_application_error(-20444,'Cannot Delete record');    
         else select count(patient_id)      
              into v_count1         
              from patient_visit        
              where patient_id = :old.patient_id;
    
             if v_count1 > 0 then 
                       raise_application_error(-20434,'Cannot Delete record');                  
             else  dbms_output.put_line('Deletion Successful');         
             end if;    
         end if;    
    end; 
    /
    

    “不工作”是什么意思?@Gergely Bacso它假设像我在上面提到的代码中所做的那样检查两个子表中的patient_id,但是如果我在两个表中都有与patient_id相关的记录,那么这个触发器工作正常并引发应用程序错误,但是如果我从一个表(例如Dependent tabel)中删除记录,然后这个触发器不会引发应用程序错误,而不是这个oracle引用完整性约束,oracle会给出错误。但根据我的代码,它也在第二种情况下提出了应用程序。所以你应该在你的问题中添加这些细节,以帮助帮助帮助你的人。尽量说清楚。例如,我不理解这一部分:“它在第二种情况下也会引发应用程序”。它也会引发应用程序错误,因为我们仍然在1个表中使用患者id。。所以从逻辑上讲,我们不能从父表中删除该记录。