【问题标题】:Using TRIGGERS in database ddl file在数据库 ddl 文件中使用 TRIGGERS
【发布时间】: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


【解决方案1】:

这个错误:

SQL0811N  The result of a scalar fullselect, 
SELECT INTO statement, or VALUES INTO statement is more than one row.

可能是这行引起的:

N.MovieID = (SELECT MovieID FROM Directs WHERE DirectorID = N.DirectorID)

一个导演肯定可以拍不止一部电影吗?

在这种情况下,SELECT 将返回多行而不是仅返回一个 MovieID。

也许你应该把它改成:

N.MovieID IN (SELECT MovieID FROM Directs WHERE DirectorID = N.DirectorID)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多