【问题标题】:Triggers in Oracle SQL DeveloperOracle SQL Developer 中的触发器
【发布时间】:2020-04-01 03:56:19
【问题描述】:

如果某人从“STUDENT”表中删除,我需要设置trigger 以将“GRADE”表中某人的成绩从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;

我知道这不可能是正确的,因为我在“结束”上加上了红色下划线。我还认为应该有人确保只有从“STUDENT”表中删除的学生的成绩才应该更改为 D。到目前为止,我们只做了如果你将某人添加到表 A,那么他们是自动放入表 B,所以我对如何使用 UPDATE 而不是带有触发器的 INSERT 并确保只影响“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;

现在我的问题是,就像我担心的那样,它会影响“GRADES”表中的每一行,而不仅仅是被删除的学生。所以现在我的问题是,我怎样才能确保我只影响我删除的学生的行?

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

【问题讨论】:

  • 提示:grade is null.
  • 请编辑问题并显示表格定义。这种情况没有意义。如果您删除学生记录,则假设您有有效的外键定义,则该学生不会有任何成绩。
  • 您不希望成绩与任何学生无关。请参阅下面的@Belayer 答案。
  • 欢迎来到 SO。请阅读本文以了解一旦有人回答了您的问题,您必须做什么。 stackoverflow.com/help/someone-answers

标签: oracle plsql database-trigger


【解决方案1】:

一个问题:你为什么要这样做?从那以后绝对没有。由于设置明确 GRADES 是 STUDENT 的子表,并且应该有从 Grades 到 Student 的 FK。如果该 FK 不存在,他们愿意接受孤立的成绩行;这就是你努力创造的东西。 如果该 FK 确实存在,则 ON Delete 子句有 3 种可能性。

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

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

【讨论】:

  • 重点只是教我们触发器,最终结果不应该是功能性的。
  • 的问题。使用糟糕的示例/过程进行教学只是糟糕的教学,尤其是当有好的功能示例可供使用时。
【解决方案2】:

如果表中存在 student_id 列,则使用它,并使用删除前触发器。 这里 :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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    相关资源
    最近更新 更多