【问题标题】:Is the BEFORE Trigger statement executed before the DDL statement?BEFORE Trigger 语句是否在 DDL 语句之前执行?
【发布时间】:2020-07-06 03:14:18
【问题描述】:

BEFORE 触发器语句是在 DDL 语句之前执行还是在 DDL 语句内部?

我正在构建一个小型 DBMS,目前正在开发 DDL,我对如何处理 BEFORE 语句感到困惑。

这里没有定义它的行为:

https://web.csulb.edu/colleges/coe/cecs/dbdesign/dbdesign.php?page=sql/ddldml.php

Oracle 描述了行为,但没有描述前面或后面的触发器中可能出现的内容,或者它们是否可以是 DDL 语句:

https://www.oracletutorial.com/plsql-tutorial/oracle-trigger/

【问题讨论】:

    标签: sql oracle triggers


    【解决方案1】:

    “BEFORE”是定义触发器的 DDL 语句的一部分。它描述了触发器何时触发与表上的 DML 命令相关:即实际更改数据之前或之后。这允许您在应用新数据时对其进行验证或修改,或者在父表更新完成后添加或修改子表等依赖数据。

    虽然您可以在技术上使用“立即执行”将 DDL 嵌入到触发器的主体中,但这样做通常被认为是非常糟糕的做法。您是否正在考虑在触发器中包含 DDL 语句的特定用例?

    【讨论】:

    • 您的回答澄清了很多,因为出于某种奇怪的原因,我认为 BEFORE 语句是 CREATE 语句的指令,而不是条件验证。我正在考虑启用 DDL 语句的链式执行,但这只是实验性的。我不喜欢拥有触发器,但人们经常使用它们,我试图让它们更加灵活。
    • "虽然您可以在技术上使用“立即执行”将 DDL 嵌入到触发器的主体中" - 不,您不能,因为 DDL 隐式提交并且您无法提交在触发器中。
    • 同样,不建议这样做,但您可以在触发器中使用自治事务。您还可以从模式或数据库触发器发出授权 - 也被视为 ddl。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多