【发布时间】:2015-10-13 00:42:36
【问题描述】:
所以我有以下实体:导演实体和电影实体。这 2 个实体有 2 个关系:Directs 关系和 WonAward 关系。为了确保导演只能凭借他/她导演的电影获奖,我创建了以下触发器:
CREATE OR REPLACE TRIGGER CheckDirect
AFTER INSERT ON WonAward
REFERENCING NEW AS N
FOR EACH ROW
WHEN (N.DirectorID = (SELECT DirectorID FROM Directs WHERE MovieID = N.MovieID) and
N.MovieID IN (SELECT MovieID FROM Directs WHERE DirectorID = N.DirectorID))
BEGIN
INSERT INTO WonAward VALUES (N.DirectorID, N.MovieID, N.AwardName, N.Year, N.Budget);
END;
但是当我运行它时,我不断收到错误:
BEGIN
INSERT INTO WonAward VALUES (N.DirectorID, N.MovieID, N.AwardName, N.Year, N.Budget)
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0104N An unexpected token "END-OF-STATEMENT" was found following "e,
N.Year, N.Budget)". Expected tokens may include: "<psm_semicolon>". LINE
NUMBER=10. SQLSTATE=42601
END
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0104N An unexpected token "END-OF-STATEMENT" was found following "END".
Expected tokens may include: "JOIN <joined_table>". SQLSTATE=42601
我删除了 INSER 语句末尾的分号并运行它,但没有任何变化。去掉 END 后的分号,也没有变化。当我运行一个测试 INSERT 语句时,导演获得了他/她没有执导的电影的奖项,它成功地通过了它不应该的。
现在,如果我更改 TRIGGER 并取出 BEGIN 和 END 部分,它会成功运行,但最终会通过不应通过的 INSERT 语句,即导演因他/她没有的电影而获奖直接,并且它使应该成功通过的 INSERT 语句失败,并出现以下错误:
SQL0723N An error occurred in a triggered SQL statement in trigger
"CHECKDIRECT". Information returned for the error includes SQLCODE
"-803", SQLSTATE "23505" and message tokens "1|GHADDAM.WONAWARD".
SQLSTATE=09000
【问题讨论】:
-
用您正在使用的数据库标记您的问题。
标签: sql database triggers db2 ddl