2017-04-06 3 views
0

Ich habe diesen Trigger erstellt, der verhindert, dass doppelte acct # hinzugefügt wird. Aber wenn ich den Auslöser getestet, indem ein Duplikat acct # Einfügen, bekam ich FehlerPLSQL_trigger duplicate a # hat Fehler

Unique-Constraint (JL.PK.ACCOUNT) VERLETZT

Bitte helfen.

create or replace trigger update_acct# 
    before insert or update on ACCOUNT 
    for each row 
    declare 
     v_cta# NUMBER; 

    begin 
     select count(A#) into v_cta# from account where A#=:new.A#; 
     if v_cta#>1 then 
      raise_application_error (-20105, 'DUPLICATE ACCOUNT NUMBER'); 
     end if; 
    end; 

Antwort

1

Sie sollten, wenn die Bedingung:

--old code 
if v_cta#>1 then 
      raise_application_error (-20105, 'DUPLICATE ACCOUNT NUMBER'); 
end if; 

--new code 
if v_cta#>0 then 
    raise_application_error (-20105, 'DUPLICATE ACCOUNT NUMBER'); 
end if; 

Wenn v_cta # gleich 1 ist, dann wird Ihr Zustand nicht funktioniert

+0

Vielen Dank !!! Es funktionierte, als ich die Zählung von 1 auf 0 änderte. – user7770852

2

Ihr Auslöser nicht den Fehler werfen haben. Es hat nicht einmal geschossen.

Sie haben die Tabellendefinition nicht aus dem angegebenen Fehler veröffentlicht, aber es sieht so aus, als ob die Spalte A # in als Primärschlüssel definiert ist. Wenn Sie versuchten, die doppelte Zeile einzufügen, wurde der Fehler ausgelöst, während der PK überprüft wurde. Sie müssen den Primärschlüssel nicht auf Duplikate überprüfen: Oracle garantiert, dass dieser eindeutig ist.

Weiter hatten Sie Trigger ausgelöst Sie hätten einen Fehler "ORA-04091 Tabelle Name mutiert ...". Sie können die Triggertabelle innerhalb eines Triggers auf Zeilenebene nicht referenzieren.

+0

Vielen Dank für die Kommentare !! Ich verstehe nicht "Sie können die Trigger-Tabelle nicht innerhalb eines Triggers auf Zeilenebene referenzieren." – user7770852

+0

Der Trigger wird beim Einfügen oder Aktualisieren der ACCOUNT-Tabelle ausgelöst. In diesem Trigger können Sie also nicht aus dem ACCOUNT auswählen, es gibt eine Ausnahme für das Einfügen in Tabellenwerte (...) und Oracle kann dies garantieren; s eine einzelne Zeile. – Belayer