有没有办法检查 truncate table?

Is there a way to do a checking on truncate table?

有时我会尝试在多个模式之间测试场景,deleting/modifying tables,inserting/updating/deleting 查询,一些模式正在测试,其他模式对生产很重要。所以有时我 运行 不小心查询了错误的模式。所以 commit 功能在这种情况下确实有帮助。

然而 Truncate table tab1 不需要 commit,如果我在错误的架构中执行它..你知道 scneario。

我的问题:是否有类似 t运行cate table 的提交的解决方法,如 DML 声明?如果删除一个语句,则必须包含一个提交,或者在 plsql 中,您必须单击绿色按钮进行提交。

我使用这样的检查,每次我想运行cate 我必须修改条件时,它真的很烦人。

select count(1) into cnt from tab1 if cnt =0 then execute'Truncate table tab1'; end if;

我不是在寻找闪回。我需要检查 t运行cate table

TRUNCATE 是 DDL 语句,不是 DML,DDL 语句自动包含提交。有关详细信息,请参阅 https://asktom.oracle.com/pls/asktom/f?p=100:11:0%3A%3A%3A%3AP11_QUESTION_ID:7072180788422

我不完全确定我理解您正在尝试做什么 - 您可以,正如 Tom 所建议的那样,也许使用自治事务来保持截断分开?如果您希望能够将提交部分与截断部分分开(即,如果您决定调用错误,则回滚截断),那么恐怕您运气不好。

正如@Boneist 所说,truncateDDL 语句, 隐式提交 。如果您不确定您在模式中执行的操作,并且只想在手动验证后提交,则不要截断,而是使用 DELETE

使用 DELETE 语句,您可以控制 提交。话虽如此,TRUNCATE 会将高水位线重置为零,但是 DELETE 不会。即使您从 table 中删除所有行,Oracle 也会扫描 HWM 下的所有块。看看这个 AskTom link.

如果您希望恢复被截断的数据,并且您使用的是 11gR2 及更高版本,则可以使用 Flashback support for DDL statements.