Der er flere problemer med din trigger. Lad os begynde med 'forholdet' mellem et udvalgt udsagn og den resterende kode. I dette særlige tilfælde select..
og if...end_if
(antag i øjeblikket, at dit udvalg faktisk virker, det gør det ikke, men antager bare). Koncentrer dig nu om WHERE-sætningen.
SELECT SUPPLIER.TRUSTED_SUPPLIER
INTO TRUST
...
WHERE SUPPLIER.TRUSTED_SUPPLIER = 'YES';
IF TRUST = 'NO' THEN ...
Da dit valg KUN returnerer JA, vil if-sætningen aldrig være Sand. Ansøgningsundtagelsen kan derfor aldrig rejses. Hvad er problemerne med select
.
Nå, først får du adgang til bordet, som udløseren er udløst på. Mens du i nogle tilfælde kan slippe af sted med det, men normalt resulterer det i en ORA -04091:tabel
INTO-sætningen kræver dog, at sætningen returnerer nøjagtig 1 række . Mere end 1 række resulterer i undtagelsen, og 0 rækker resulterer i en no data found
undtagelse.
Endelig er der et problem med raise_application_error statement
. Hvis det blev udført, ville det rejse et talargument...er uden for rækkevidde undtagelse. Den første parameter skal være mellem -20999 til -20000 (negativt tal). Så hvordan ser resultatet ud:
create or replace trigger verify_supplier_trust
before insert or update on product
for each row
declare
trust varchar2(3);
begin
select supplier.trusted_supplier
into trust
from supplier
where supplier.company_name = :new.supplier_name
and supplier.trusted_supplier = 'YES';
exception
when no_data_found then
raise_application_error(-20001, 'supplier not trusted');
end;
/
BEMÆRKNINGER:
Brug ikke datatypen VARCHAR. Det er tilladt, men Oracle fraråder det. Betyder, at de forbeholder sig retten til at ændre, hvad den gør til enhver tid. Brug den anbefalede VARCHAR2 i stedet.
Jeg ændrer triggeren til at aktiveres på enten Indsæt eller Opdater. Hvis den udløses på Indsæt, KAN kun nogen ændre leverandørnavnet for at referere til en ikke-pålidelig leverandør, og alt ville være i orden.