简体   繁体   English

在 Oracle 数据库中插入、删除、更新返回旧值和新值的触发器

[英]Trigger for insert, delete, update returning old & new value in Oracle Database

So i have got a table called parts with the columns PartID, PartName, PartColor, PartPrice, PartCity and I want to create a trigger that returns the old and new values via .put_line when inserting and updating and return the old value when deleting.因此,我有一个名为parts的表,其中包含 PartID、PartName、PartColor、PartPrice、PartCity列,我想创建一个触发器,在插入更新时通过.put_line返回旧值和新值,并在删除时返回旧值。

I want to do this all with one trigger.我想用一个触发器来完成这一切。

I wrote this trigger, which isn't working:我写了这个触发器,它不起作用:

(PL/SQL: Statement ignored PLS-00306: wrong number or types of arguments in call to 'DELETING' PL/SQL: Statement ignored PLS-00306: wrong number or types of arguments in call to 'INSERTING') (PL/SQL:语句被忽略 PLS-00306:错误编号或类型的 arguments 在调用“DELETING” PL/SQL:语句被忽略 PLS-00306:错误编号或类型的 arguments 在调用“插入”)


create or replace trigger parts_aft_upd_ins_del
after update or insert or delete
on parts
for each row
begin
    if updating then
        dbms_output.put_line('Triggered by UPDATE');
        
        if updating('PartID') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartID) || ' NEW:  ' ||
                         trim(:new.PartID));
                         
        elsif updating('PartName') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartName) || ' NEW:  ' ||
                         trim(:new.PartName));
                        
        elsif updating('PartColor') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartColor) || ' NEW:  ' ||
                         trim(:new.PartColor));
                         
        elsif updating('PartPrice') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartPrice) || ' NEW:  ' ||
                         trim(:new.PartPrice)); 
                         
        elsif updating('PartCity') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartCity) || ' NEW:  ' ||
                         trim(:new.PartCity)); 
        
        else
             dbms_output.put_line('Old & New values unknown.');  
        
        end if;
        
    elsif deleting then
        dbms_output.put_line('Triggered by DELETE');
        
        if deleting('PartID') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartID) ||);
                         
        elsif deleting('PartName') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartName));
                       
        elsif deleting('PartColor') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartColor));
                         
        elsif deleting('PartPrice') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartPrice)); 
                         
        elsif deleting('PartCity') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartCity)); 
        
        else
             dbms_output.put_line('Old values unknown.');  
        
        end if;
    elsif inserting then
        dbms_output.put_line('Triggered by INSERT');
        
        if inserting('PartID') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartID) || ' NEW:  ' ||
                         trim(:new.PartID));
                         
        elsif inserting('PartName') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartName) || ' NEW:  ' ||
                         trim(:new.PartName));
                        
        elsif inserting('PartColor') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartColor) || ' NEW:  ' ||
                         trim(:new.PartColor));
                         
        elsif inserting('PartPrice') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartPrice) || ' NEW:  ' ||
                         trim(:new.PartPrice)); 
                         
        elsif inserting('PartCity') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartCity) || ' NEW:  ' ||
                         trim(:new.PartCity)); 
        
        else
             dbms_output.put_line('Old & New values unknown.');  
        
        end if;
        
    else 
        dbms_output.put_line('Trigger "parts_aft_upd_ins_del" unknown error.');
    end if;
end;
/
show errors

Do you have any idea how I am able to solve this problem?你知道我如何解决这个问题吗?

You are deleting the whole row , so there's no point in eg deleting('PartID') .您正在删除整,因此例如deleting('PartID')没有意义。 Use deleting only.仅使用deleting

There are multiple errors in your trigger.您的触发器中有多个错误。

  • deleting / inserting do not take any parameters. deleting / inserting不带任何参数。 They are booleans.它们是布尔值。
  • While inserting :old values are always null and while deleting :new values are always null.插入时:old值始终为 null,而删除时:new值始终为 null。

Use the following code where both of the above issues are resolved.使用以下代码解决上述两个问题。

create or replace trigger parts_aft_upd_ins_del
after update or insert or delete
on parts
for each row
begin
    if updating then
        dbms_output.put_line('Triggered by UPDATE');
        dbms_output.put_line('OLD: ' || trim(:old.PartID) || ' NEW: ' || trim(:new.PartID));
        dbms_output.put_line('OLD: ' || trim(:old.PartName) || ' NEW:  ' || trim(:new.PartName));
        dbms_output.put_line('OLD: ' || trim(:old.PartColor) || ' NEW:  ' || trim(:new.PartColor));
        dbms_output.put_line('OLD: ' || trim(:old.PartPrice) || ' NEW:  ' || trim(:new.PartPrice)); 
        dbms_output.put_line('OLD: ' || trim(:old.PartCity) || ' NEW:  ' || trim(:new.PartCity));       
    elsif deleting then
        dbms_output.put_line('Triggered by DELETE');
        dbms_output.put_line('OLD: ' || trim(:old.PartID) ||);
        dbms_output.put_line('OLD: ' || trim(:old.PartName));
        dbms_output.put_line('OLD: ' || trim(:old.PartColor));
        dbms_output.put_line('OLD: ' || trim(:old.PartPrice)); 
        dbms_output.put_line('OLD: ' || trim(:old.PartCity));        
    elsif inserting then
        dbms_output.put_line('Triggered by INSERT');
        dbms_output.put_line(' NEW:  ' || trim(:new.PartID));
        dbms_output.put_line( ' NEW:  ' || trim(:new.PartName));
        dbms_output.put_line( ' NEW:  ' || trim(:new.PartColor));
        dbms_output.put_line(' NEW:  ' || trim(:new.PartPrice)); 
        dbms_output.put_line(' NEW:  ' || trim(:new.PartCity)); 
    end if;    
end;
/

Thanks to @Littlefoot for pointing out my logic error.感谢@Littlefoot 指出我的逻辑错误。

The code now works just fine:代码现在工作得很好:

create or replace trigger parts_aft_upd_ins_del
after update or insert or delete
on parts
for each row
begin
    if updating then
        dbms_output.put_line('Triggered by UPDATE');
        
        if updating('PartID') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartID) || ' NEW:  ' ||
                         trim(:new.PartID));
                         
        elsif updating('PartName') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartName) || ' NEW:  ' ||
                         trim(:new.PartName));
                        
        elsif updating('PartColor') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartColor) || ' NEW:  ' ||
                         trim(:new.PartColor));
                         
        elsif updating('PartPrice') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartPrice) || ' NEW:  ' ||
                         trim(:new.PartPrice)); 
                         
        elsif updating('PartCity') then
            dbms_output.put_line('OLD: ' ||
                         trim(:old.PartCity) || ' NEW:  ' ||
                         trim(:new.PartCity)); 
        
        else
             dbms_output.put_line('Old & New values unknown.');  
        
        end if;
        
    elsif deleting then
        dbms_output.put_line('Triggered by DELETE');
        
        if deleting() then
            dbms_output.put_line('OLD PartID: ' || trim(:old.PartID) || 
                                 ' OLD PartName: ' || trim(:old.PartName) ||
                                 ' OLD PartColor: ' || trim(:old.PartColor) || 
                                 ' OLD PartPrice: ' || trim(:old.PartPrice) ||
                                 ' OLD PartCity: ' || trim(:old.PartCity)
                                 );
                         
        else
             dbms_output.put_line('Old values unknown.');  
        
        end if;
    elsif inserting then
        dbms_output.put_line('Triggered by INSERT');
        
        if inserting() then
            dbms_output.put_line('NEW PartID: ' || trim(:new.PartID) || 
                                 ' NEW PartName: ' || trim(:new.PartName) ||
                                 ' NEW PartColor: ' || trim(:new.PartColor) || 
                                 ' NEW PartPrice: ' || trim(:new.PartPrice) ||
                                 ' NEW PartCity: ' || trim(:new.PartCity)
                                 );
        
        else
             dbms_output.put_line('New values unknown.');  
        
        end if;
        
    else 
        dbms_output.put_line('Trigger "parts_aft_upd_ins_del" unknown error.');
    end if;
end;
/
show errors

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

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