1

假设您有一个“删除时”触发器

1 当你触发删除时会发生什么?

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

  1. 当你触发截断时会发生什么?

    我的猜测 - 因为 truncate(DDL) 和 delete(DML) 是完全不同的命令,所以什么都不会发生

还有一个问题:触发器不会在 DDL 语句上触发,对吗?

4

2 回答 2

2

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

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

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

来自 AskTom:

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

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:492636200346818072

希望能帮助到你...

于 2012-04-18T06:19:24.513 回答
1
  1. 正确的
  2. 触发器不会触发,你是对的,没有 DML 触发器应该在 DDL 语句上触发。

更多信息:http ://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

于 2012-04-18T06:07:31.440 回答