[英]Firebird 2.5 commit/rollback (using autonomous transaction) in loop
[英]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.