2

好的,所以我认为我的问题应该是一个简单的问题。我只是在学习触发器,我正在尝试找出一个家庭作业问题。我有三个表, Movies(标题、年份、长度、流派、工作室名称、制片人) StarsIn(movieTitle、starName) MovieStar(姓名、地址、性别、出生日期)

所以基本上我需要编写一个触发器来确保在任何时候出现在 StarsIn 中的任何明星也出现在 MovieStar 中。我需要为插入和更新事件触发。

更新:好的,所以我稍微改变了我的陈述,但我仍然无法弄清楚

CREATE OR REPLACE TRIGGER movieTrigger
  AFTER UPDATE OR INSERT ON STARSIN
  FOR EACH ROW
  WHEN(new.STARNAME NOT IN(SELECT "NAME" FROM MOVIESTAR))
  BEGIN
INSERT INTO MOVIESTAR("NAME")
VALUES(new.STARNAME)
END;

现在我收到错误

Error report:
ORA-02251: subquery not allowed here
02251. 00000 -  "subquery not allowed here"
*Cause:    Subquery is not allowed here in the statement.
*Action:   Remove the subquery from the statement.

我刚刚了解到 oracle 不支持 when 子句中的子查询......所以我试图用有限的知识来解决这个问题。但是,如果有人有这样做的聪明方法,我真的很想知道:-)。

再次感谢

4

2 回答 2

1

您创建了语句级触发器。它会为每个插入或更新语句触发一次。但是单个插入或更新语句可以一次插入/更新许多行。但是,您的代码需要一行,并假定仅插入或更新一行。

如果您想遵循这条路径,您需要的是行级触发器(“FOR EACH ROW”)。

于 2013-05-04T19:52:49.613 回答
0

trigger应该被解雇before(在这种情况下)insert任何一个row(目前它会为插入一次的多行触发一次)

我建议阅读http://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adg13trg.htm

最好使用外键约束来确保表中出现的值b存在于表中,在这种情况下,表a中应该有一个foreign key用于表中的StarsInstarName引用nameMovieStar

于 2013-05-04T19:49:45.213 回答