簡體   English   中英

通過語用自主事務在觸發器中使用提交/回滾

[英]Usage of Commit/ Rollback in Triggers via Pragma Autonomous Transaction

我試圖在某個地方解決一個問題,該問題是防止表通過觸發器以相反的方式刪除記錄。

我認為另一種方法是在特定表上發生刪除后,觸發器將提交該刪除並回滾到上一個階段,從而防止刪除。

但是,這似乎並沒有發生,因為我猜測提交狀態與表刪除狀態不一樣。 有什么辦法可以使我通過觸發器commit提交已刪除狀態,然后回滾,就像我們通過插入/更新關鍵字在觸發器中獲取更新/插入記錄的狀態一樣。下面是示例代碼。

     CREATE OR REPLACE  TRIGGER 
     GET_DEL_INSTANCE
    AFTER DELETE ON Demo_Table
      DECLARE
      PRAGMA 
      AUTONOMOUS_TRANSACTION;
        BEGIN

       Raise_Aplication_Error() // just to have usage of commit and rollback in trigger
       COMMIT;
       ROLLBACK;
         END;

提交並回滾? 那是行不通的。 但是,這樣的觸發器可能會:

SQL> create table test (id number);

Table created.

SQL> insert into test (id) select level from dual connect by level < 4;

3 rows created.

SQL> create or replace trigger trg_bd_test
  2    before delete on test
  3    for each row
  4  begin
  5    raise_application_error(-20000, 'Delete is not allowed');
  6  end;
  7  /

Trigger created.

SQL> select * From test;

        ID
----------
         1
         2
         3

SQL> delete from test where id = 2;
delete from test where id = 2
            *
ERROR at line 1:
ORA-20000: Delete is not allowed
ORA-06512: at "SCOTT.TRG_BD_TEST", line 2
ORA-04088: error during execution of trigger 'SCOTT.TRG_BD_TEST'


SQL>

[閃回]

提交是不可逆的; 回滾不會影響它。 但是,閃回(如果您的數據庫版本支持)可能會很有趣。 看一看:

SQL> alter trigger trg_bd_test disable;

Trigger altered.

SQL> delete from test where id = 2;

1 row deleted.

SQL> commit;

Commit complete.

SQL> select * From test;

        ID
----------
         1
         3

SQL> rollback;

Rollback complete.

SQL> select * from test;

        ID
----------
         1
         3

SQL> select * From test as of timestamp to_timestamp('21.07.2019 22:10', 'dd.mm.yyyy hh24:Mi');

        ID
----------
         1
         2
         3

SQL>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM