Oracle DDL语句期间是否触发触发器?

Oracle DDL语句期间是否触发触发器?,oracle,triggers,Oracle,Triggers,假设您有一个“on delete”触发器 1当您触发删除时会发生什么 触发器将被触发,触发器主体将被执行 当您触发截断时会发生什么情况? 我猜不会发生什么事情,因为truncate(DDL)和delete(DML)是完全不同的命令 还有一个问题:触发器不会对DDL语句触发,对吗 正确的 触发器不会触发,您认为DDL语句不应该触发DML触发器,这是正确的 更多信息:正如@Eggi所说,您在问题中的断言是正确的 除了他的答案和链接中给出的详细信息,TRUNCATE将重置表中的高位标记,而DELET

假设您有一个“on delete”触发器

1当您触发删除时会发生什么

触发器将被触发,触发器主体将被执行

  • 当您触发截断时会发生什么情况?

    我猜不会发生什么事情,因为truncate(DDL)和delete(DML)是完全不同的命令
  • 还有一个问题:触发器不会对DDL语句触发,对吗

  • 正确的
  • 触发器不会触发,您认为DDL语句不应该触发DML触发器,这是正确的

  • 更多信息:

    正如@Eggi所说,您在问题中的断言是正确的

    除了他的答案和链接中给出的详细信息,
    TRUNCATE
    将重置表中的高位标记,而
    DELETE
    不会

    如果您的表的大小发生了很大的变化,那么这可能是非常相关的

    来自AskTom:

    HWM是相关的,因为Oracle将扫描HWM下的所有块, 即使它们不包含任何数据,在完全扫描期间也是如此。这将影响 全扫描的性能?特别是当大多数块处于 HWM是空的。要查看这一点,只需创建一个包含1000000的表 行(或创建任何包含大量行的表),然后 从该表中执行SELECT COUNT()。现在,删除其中的每一行 您会发现SELECT COUNT()所用的时间与 更长的时间,如果你需要清理积木!参考“积木” 第9章的“清理”部分)中,以计数0行 1,000,000. 这是因为Oracle正忙于读取所有的块 查看它们是否包含数据。你应该把这个和 如果对表使用TRUNCATE而不是DELETE,会发生什么 每一行。TRUNCATE将表的HWM重置为 “零”,并将截断表上的关联索引。 如果您计划删除表中的每一行,请在可能的情况下截断 出于这个原因,使用?将是选择的方法


    希望它能有所帮助…

    正如您提到的“DDL语句不应触发DML触发器”。。。基于此,我提出了一个问题:oracle pl/sql是否也提供DDL触发器?还有一件事……上面提到的链接说,“在TRUNCATE的情况下,触发器不会被触发。但是在DML命令中,如DELETE.Trigger会被触发。”……当我们谈论触发器时……我们是否默认谈论DML触发器……请不要介意……我问了很多……但问题是我想澄清我自己的问题concepts@jain007对当人们谈论Oracle触发器时,他们倾向于提到DML触发器,因为它们是大多数RDBMS系统中使用的最常见的触发器。是的…这提供了一个全新的东西…HWM…这可以通过DDL truncate设置,还是有其他sql命令将HWM重置为零/或某些指定值?还有一个问题:do truncate命令首先删除表,然后重新创建表?这是Tom Kyte关于HWM的一个好链接:这是关于重置HWM的链接:关于您关于
    TRUNCATE
    :TRUNCATE将表的高水位线移回零。不执行行级锁,不生成重做或回滚。从表中取消分配初始数据块的所有数据块(如果将MINEXTENTS设置为除1以外的任何值,则保留该数据块数,而不仅仅是初始数据块数)。通过重新定位高水位线,它们阻止读取任何表数据,因此它们具有与删除相同的效果,但没有所有开销。