Показахте кода на части. но изглежда, че изпълнявате това, което сте показали заедно като скрипт, първоначално без актуализацията:
drop table SalUpdates cascade constraints;
create table SalUpdates(
SalSSN char(9),
newSalary decimal(10,2),
oldSalary decimal(10,2)
);
create or replace trigger t1
after update of salary on employee
for each row
begin
insert into SalUpdates values (:old.Ssn, :new.salary, :old.salary);
end;
Когато се изпълнява като скрипт в SQL Developer, изходният прозорец на скрипта показва:
drop table SalUpdates cascade constraints
Error report -
ORA-00942: table or view does not exist
00942. 00000 - "table or view does not exist"
*Cause:
*Action:
Table SALUPDATES created.
Trigger T1 compiled
Ако след това добавите израза за актуализиране към скрипта:
drop table SalUpdates cascade constraints;
create table SalUpdates(
SalSSN char(9),
newSalary decimal(10,2),
oldSalary decimal(10,2)
);
create or replace trigger t1
after update of salary on employee
for each row
begin
insert into SalUpdates values (:old.Ssn, :new.salary, :old.salary);
end;
update employee
set salary=4000
where ssn='123456789';
получавате:
Table SALUPDATES dropped.
Table SALUPDATES created.
Trigger T1 compiled
Errors: check compiler log
Ако след това се опитате да стартирате актуализацията сама (като израз вместо скрипт; или като изберете този тест и стартирате като скрипт), вие наистина получавате:
SQL Error: ORA-04098: trigger 'MYSCHEMA.T1' is invalid and failed re-validation
04098. 00000 - "trigger '%s.%s' is invalid and failed re-validation"
*Cause: A trigger was attempted to be retrieved for execution and was
found to be invalid. This also means that compilation/authorization
failed for the trigger.
*Action: Options are to resolve the compilation/authorization errors,
disable the trigger, or drop the trigger.
Ако направите заявка за user_errors
прегледайте или стартирайте show errors
, ще видите:
PLS-00103: Encountered the symbol "UPDATE"
Проблемът е, че не изпълнявате create trigger
изявление правилно. update
се разглежда като част от същия PL/SQL блок; невалидна част, но все пак включена.
Когато имате PL/SQL блок, трябва да го прекратите с наклонена черта, както е обяснено в документацията на SQL*Plus (което най-вече се отнася и за SQL Developer):
SQL Developer обаче не се оплаква, ако последният блок в скрипта няма крайна наклонена черта, така че вашият оригинален скрипт (без актуализацията) работи; в SQL*Plus ще се намира при подкана
. Някак си подсказва, че трябва да е там - опитвайки се да бъде полезен. Когато добавите update
това вече не е краят на скрипта, така че това не се прилага.
Ако добавите наклонена черта към вашия скрипт между PL/SQL кода и следния SQL израз, всичко работи:
drop table SalUpdates cascade constraints;
create table SalUpdates(
SalSSN char(9),
newSalary decimal(10,2),
oldSalary decimal(10,2)
);
create or replace trigger t1
after update of salary on employee
for each row
begin
insert into SalUpdates values (:old.Ssn, :new.salary, :old.salary);
end;
/
update employee
set salary=4000
where ssn='123456789';
и сега виждате:
Table SALUPDATES dropped.
Table SALUPDATES created.
Trigger T1 compiled
1 row updated.