Oracle SQL Developer中的触发器

Oracle SQL Developer中的触发器,oracle,plsql,database-trigger,Oracle,Plsql,Database Trigger,我需要设置一个触发器,将“成绩”表中的某个人的成绩从null更改为“D”,如果他们从“学生”表中删除。到目前为止,我已经: create or replace trigger delete_from_student after delete on student for each row begin update grades set grade = 'D' where grade = '' end delete_from_student; 我知道这不可能是对的,因为我在“end”上有

我需要设置一个
触发器
,将“成绩”表中的某个人的成绩从
null
更改为“D”,如果他们从“学生”表中删除。到目前为止,我已经:

create or replace trigger delete_from_student
after delete on student 

for each row
begin

update grades
set grade = 'D'
where grade = ''

end delete_from_student;
我知道这不可能是对的,因为我在“end”上有红色下划线。我还认为应该有人确保只有从“student”表中删除的学生才能将他们的成绩更改为D。到目前为止,我们只做了这样一件事:如果你将某人添加到表a中,那么他们会自动放入表B中,因此,我在如何使用带有触发器的更新而不是插入以及确保只影响“GRADES”表中的一行时被绊倒了。谢谢你的帮助

编辑:我已经阅读了更多的页面,我终于想出了触发的语法:

create or replace trigger delete_from_student
after delete on student 

for each row
begin

update grades set
grade = 'D'
where grade is null;

end delete_from_student;
现在我的问题是,就像我担心的那样,它会影响“成绩”表上的每一行,而不仅仅是被删除的学生。现在我的问题是,如何确保我只影响我删除的学生的行


第二次编辑:这个练习的目的只是教我们触发器是如何工作的,而不是创建一个功能数据库。教授在开场白中说,由于其他人列出的原因,你不会在现实世界中这样做,但他只是在教我们有关触发器的知识

如果表中存在student_id列,请使用该列,并使用before delete触发器。 此处:old.student_id是删除行中列的值

  create or replace trigger delete_from_student
  before delete on student 

   for each row
   begin

   update grades set
   grade = 'D'
   where grade is null
   and student_id=:old.student_id;

 end delete_from_student;

一个问题:你为什么要这样做?从那以后就再也没有了。由于设置清楚,年级是学生的子表,每个年级之间应该有一个FK。如果FK不存在,他们愿意接受孤立分数行;这就是你如此努力的工作所创造的。 如果FK确实存在,则ON Delete子句有3种可能性

  • 级联。在这种情况下,您刚刚更新的总行将被删除。那么,更新它有什么意义呢
  • 限制(未指定删除时的默认设置)。在这种情况下,将抛出异常“ORA-02292:完整性约束…”。这将否定成绩更新和学生删除
  • 设置空值。在这种情况下,您刚刚创建了孤立行,就好像FK不存在一样

  • 因此,在流程结束时,您有一个异常或孤立的成绩行,您无法确定该行所属的学生,因为该学生行已不存在。如果是这样的话,显然您的数据模型已经损坏

    提示:
    成绩为空
    。请编辑问题并显示表格定义。这种情况没有意义。如果删除某个学生记录,则假设您具有有效的外键定义,则该学生将不会有任何成绩。您不希望该成绩不链接到任何学生。请参阅下面的@Belayer答案。欢迎使用SO。请阅读此文,了解一旦有人回答您的问题,您必须做什么。关键是教我们触发器,最终结果不应该是功能性的,这就是问题所在。使用不好的示例/流程进行教学就是不好的教学,尤其是当有好的功能示例可供使用时。