【发布时间】:2011-11-22 09:15:51
【问题描述】:
我已经阅读了有关创建触发器的 Oracle 文档,并且正在按照它显示的方式做事,但这就是行不通。我的目标是使用 TPM_TRAININGPLAN 表中出现的最小 STARTDATE 更新 TPM_PROJECT 表。因此,每次有人更新 TPM_TRAININGPLAN 中的 STARTDATE 列时,我都想更新 TPM_PROJECT 表。这是我正在尝试的:
CREATE TRIGGER Trigger_UpdateTrainingDelivery
AFTER DELETE OR INSERT OR UPDATE OF STARTDATE
ON TPM_TRAININGPLAN
FOR EACH ROW WHEN (new.TRAININGPLANTYPE='prescribed')
BEGIN
UPDATE TPM_PROJECT SET TRAININGDELIVERYSTART = (SELECT MIN(TP.STARTDATE) FROM TPM_TRAININGPLAN TP WHERE TP.PROJECTID = new.PROJECTID AND TP.TRAININGPLANTYPE='prescribed')
WHERE PROJECTID = new.PROJECTID
END;
触发器创建时没有错误,但我确实收到了警告:
Warnings: --->
W (1): Warning: execution completed with warning
<---
当然,Oracle 并不足以真正告诉我警告是什么,我只是被证明有警告。
接下来,如果我更新训练计划表:
UPDATE TPM_TRAININGPLAN
set STARTDATE = to_date('03/12/2009','mm/dd/yyyy')
where TRAININGPLANID=15916;
我收到错误消息:
>[Error] Script lines: 20-22 ------------------------
ORA-04098: trigger 'TPMDBO.TRIGGER_UPDATETRAININGDELIVERY' is invalid and failed re-validation
Script line 20, statement line 1, column 7
任何想法我做错了什么?谢谢!
【问题讨论】:
-
要显示警告消息,请输入
show errors。此外,您在 BEGIN 和 END 之间的语句中似乎缺少:new上的绑定冒号。
标签: sql database oracle oracle11g