繁体   English   中英

在插入或更新之前,触发器函数未在 Oracle pl/sql 中执行

[英]trigger function is not executing in Oracle pl/sql before insert or update

在任何块中插入和更新语句 SI 不调用触发器,因为我的触发器代码中的错误请帮助我解决我的错误,因为我是触发器概念的新手......

问题:HR 经理想要跟踪每个部门的所有经理详细信息,以便将来进行审计。 每当 HR 经理分配新经理时,应将以下经理详细信息记录在 DEPT_MANAGER_LOG 表中。

  • department_id : 为其分配或修改经理的部门
  • manager_id : 被分配为经理的employee_id
  • start_date : 经理被分配到部门的日期
  • end_date:经理的结束日期(当经理被分配时,结束日期将为空)
  • user_name:进行此修改的数据库用户的名称

每当 HR 经理更换任何部门的经理时,需要更新前任经理的结束日期,并且需要在 DEPT_MANAGER_LOG 表中插入新经理的详细信息。''' 在插入或更新部门的 manager_id 之前创建或替换触发器 trg_mgr_log每一行

代码:

create or replace trigger trg_mgr_log
before insert or update of manager_id on departments
for each row
declare
v_dpid departments.department_id%type ;
v_mgr_id departments.manager_id%type ;
v_start_date JOB_HISTORY.START_DATE%type;
v_end_date JOB_HISTORY.END_DATE%type;
begin
/*v_dpid := :new.department_id;
select manager_id into v_mgr_id from departments where department_id = v_dpid;*/
select START_DATE, END_DATE into v_start_date, v_end_date from job_history where employee_id = 
v_mgr_id;
if inserting then
v_dpid := :new.department_id;
select manager_id into v_mgr_id from departments where department_id = v_dpid;
if(v_mgr_id is null) then
insert into DEPT_MANAGER_LOG values (v_dpid, :new.manager_id,SYSTIMESTAMP,null,user);
end if;
elsif updating then
v_dpid := :OLD.department_id;
select manager_id into v_mgr_id from departments where department_id = v_dpid;
if(v_mgr_id is not null) then
insert into DEPT_MANAGER_LOG values (v_dpid, :old.manager_id,v_start_date,SYSTIMESTAMP,user);
insert into DEPT_MANAGER_LOG values (v_dpid, :new.manager_id,SYSTIMESTAMP,null,user);
end if;
end if;
end; '

您可能会收到“mutating table”错误,因为您是从定义触发器的同一个表中选择的。 以下应解决该问题:

create or replace trigger trg_mgr_log
  before insert or update of manager_id on departments
  for each row
begin
  if inserting and
     :new.manager_id is null
  then
    insert into DEPT_MANAGER_LOG values (:new.department_id, :new.manager_id, SYSTIMESTAMP, null, user);
  elsif updating and
        :OLD.manager_id is not null
  then
    declare
      v_start_date JOB_HISTORY.START_DATE%type;
    begin
      select START_DATE
        into v_start_date
        from job_history
        where employee_id = :new.manager_id;
  
      insert into DEPT_MANAGER_LOG values (:OLD.department_id, :old.manager_id, v_start_date, SYSTIMESTAMP, user);
      insert into DEPT_MANAGER_LOG values (:OLD.department_id, :new.manager_id, SYSTIMESTAMP, null,         user);
    end;
  end if;
end;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM