建立觸發器報錯 Oracle行級觸發器的使用

2021-10-14 17:33:42 字數 1334 閱讀 9281

1、建立觸發器並使用dblink在插入時進行資料同步

異庫異表同步

create or replace trigger triggername --觸發器名稱

after insert on tablename --操作的表

for each row ——行級觸發器

declare --這裡是關鍵的地方,在變數申明的地方,指定自定義事務處理。

pragma autonomous_transaction;

begin

insert into "test_user"@mysqltwo ("userid","username") values (:new.userid,:new.username);

--這裡需要顯示提交事務

commit;

end;

同庫異表同步

create or replace trigger triggername --觸發器名稱

after insert on tablename --操作的表

for each row ——行級觸發器

begin

insert into test_user (userid,username) values (:new.userid,:new.username);

--這裡不需要顯示提交事務

--commit;

end;

oracle 行級觸發器trigger中有:new,:old兩個特殊變數,當觸發器為行級觸發器的時候,觸發器就會提供new和old兩個儲存臨時行資料的特殊變數,我們可以從倆個特殊的變數中取出資料執行擴張表的dml操作

after 與 before驅別在兩種情況下可體現差別

第一種情況:dml語句執行失敗時,如觸發器使用before,則不會考慮語句是否執行成功,皆觸發;如使用after,因為報錯不會繼續執行而產生觸發;

第二種情況:在進行dml操作前,驗證對應操作合法性,那麼觸發器必須使用before

關於ora-04091異常的出現原因:

在oracle中執行dml語句的時候是需要顯示進行提交操作的。當我們進行插入的時候,會觸發觸發器執行對觸發器作用表和擴充套件表的種種操作,但是這個時候觸發器和插入語句是在同乙個事務管理中的,因此在插入語句沒有被提交的情況下,我們無法對觸發器作用表進行其他額外的操作。如果執行其他額外的操作則會丟擲如上異常資訊

我們知道,出錯的原因是因為觸發器和dml語句在同一事務管理中,所以方案一便是將觸發器和dml語句分成兩個單獨的事務處理。這裡可以使用pragma autonomous_transaction; 告訴oracle觸發器是自定義事務處理。

ORACLE觸發器 行級觸發器

行級觸發器 本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。1 介紹 觸發器是儲存在資料庫已編譯的儲存過程,使用的語言是pl sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql plus會話中建立和示例乙個簡單的...

Oracle觸發器介紹 行級觸發器

行級觸發器 本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。1 介紹 觸 髮器是儲存在資料庫已編譯的儲存過程,使用的語言是pl sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql plus會話中建立和示例一 個簡...

Oracle觸發器介紹 行級觸發器

行級觸發器 本章介紹行級觸發器機制。大部分例子以insert出發器給出,行級觸發器可從insert update delete語句觸發。1 介紹 觸 髮器是儲存在資料庫已編譯的儲存過程,使用的語言是pl sql,用編寫儲存過程一樣的方式編寫和編譯觸發器。下面在sql plus會話中建立和示例一 個簡...