我从名为 Carti 的表创建了一个视图,并更新了其中的一些内容,这样做会自动更新表 Carti 的原始内容。为了防止这种情况发生,我尝试编写一个触发器,将新价格设置为等于旧价格。我一直无法让它发挥作用。我收到以下错误:
View TOP_3_CARTI created.
>>Query Run In:Query Result 4
Error starting at line : 370 in command -
UPDATE top_3_carti
SET pret = 1.15*pret
Error at Command Line : 370 Column : 8
Error report -
SQL Error: ORA-04098: trigger 'SAVUA_49.ROLLBACK_PRETURI' 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.
Trigger ROLLBACK_PRETURI compiled
LINE/COL ERROR
--------- -------------------------------------------------------------
7/1 PLS-00103: Encountered the symbol "SELECT"
Errors: check compiler log
CREATE OR REPLACE VIEW top_3_carti
AS
SELECT c.* FROM Carti c WHERE c.id_carte IN (
SELECT c.id_carte
FROM Carti c, Continut_vanzari cv
WHERE c.id_carte = cv.id_carte
GROUP BY c.id_carte, c.pret
ORDER BY SUM(cv.cantitate) DESC
FETCH FIRST 3 ROWS ONLY
);
SELECT * FROM top_3_carti;
UPDATE top_3_carti
SET pret = 1.15*pret;
CREATE OR REPLACE TRIGGER rollback_preturi
BEFORE UPDATE ON Carti
FOR EACH ROW
BEGIN
IF :NEW.pret != :OLD.pret THEN
:NEW.pret := :OLD.pret;
END IF;
END rollback_preturi;
SELECT c.* FROM Carti c WHERE c.id_carte IN (
SELECT c.id_carte
FROM Carti c, Continut_vanzari cv
WHERE c.id_carte = cv.id_carte
GROUP BY c.id_carte, c.pret
ORDER BY SUM(cv.cantitate) DESC
FETCH FIRST 3 ROWS ONLY
);
您应该使用斜杠字符终止 PL/SQL 脚本:
CREATE OR REPLACE TRIGGER rollback_preturi
BEFORE UPDATE ON Carti
FOR EACH ROW
BEGIN
IF :NEW.pret != :OLD.pret THEN
:NEW.pret := :OLD.pret;
END IF;
END rollback_preturi;
/ --> this