讓我們考慮一個Table STUD和一個行級TRIGGER是通過INSERT查詢來實現的。我的情況是這樣的,無論何時插入一行,都會觸發一個觸發器,並且它應該訪問某個放置的腳本文件在硬盤上,最終應該打印結果。那麼,這是可能的嗎?如果是,那麼這個東西應該以動態的形式存在,即如果我們改變了腳本文件的內容,那麼oracle也應該反映這些改變。Oracle觸發器查詢
我已經嘗試過使用外部過程對java執行此操作,但是對於我想要的結果並不滿意。
請給出您對這種場景的觀點以及可以實施的方式。
讓我們考慮一個Table STUD和一個行級TRIGGER是通過INSERT查詢來實現的。我的情況是這樣的,無論何時插入一行,都會觸發一個觸發器,並且它應該訪問某個放置的腳本文件在硬盤上,最終應該打印結果。那麼,這是可能的嗎?如果是,那麼這個東西應該以動態的形式存在,即如果我們改變了腳本文件的內容,那麼oracle也應該反映這些改變。Oracle觸發器查詢
我已經嘗試過使用外部過程對java執行此操作,但是對於我想要的結果並不滿意。
請給出您對這種場景的觀點以及可以實施的方式。
一個社區wiki,爲什麼這是一個壞主意。
爲什麼使用動態代碼文件的原因是愚蠢的。
插入的每一行都必須打開一個文件,讀取整個內容,解析它並對結果做一些事情。這將是緩慢的。
根據操作系統環境的不同,您可能無法同時打開文件進行讀取和寫入。所以你可能會發現你必須關閉數據庫才能將代碼更改「提升」到文件中。
根據操作系統環境,您甚至可能會發現一次只能從該文件讀取一個會話。
也許觸發器會在'保存'中讀取文件並執行部分代碼。
文件安全性將與數據庫安全性完全分離,造成維護頭痛。
簡而言之,將動態代碼存儲在一個表格中,而不是一個文件,將是一個巨大的改進。
動態代碼沒有被解析/編譯:
原因,你不應該反正使用動態代碼。所以它可能無法正常工作,直到它被執行時纔會發現。
由於減少了解析開銷,因此靜態代碼的性能優於動態代碼。
Misc。原因
如果我想訪問一個文件的sh, 這是做一些OS處理
有從數據庫中執行OS的三種方式。
外部過程,它們是用C或Java編寫的OS庫的PL/SQL包裝。自Oracle 8.0起可用。 Find out more。
模擬host
命令的Java存儲過程。這是Java Runtime
的手卷包裝。該命令將以oracle
OS用戶的強大特權執行,因此不要將此過程暴露給一般用途。取而代之的是安全用戶擁有它,並編寫存儲過程以公開特定的OS功能片段(例如執行mkdir
的過程,執行ls
的功能)。可能從Oracle 8i開始。 Find out more。
DBMS_SCHEDULER。除了後臺數據庫作業,我們還可以使用計劃運行的OS作業。自Oracle 10g起可用。 Find out more
這三個選項中,DBMS_SCHEDULER可能是最安全的選擇。顧名思義,它的目的是定時運行程序(如unix cron
),所以它不適合按需運行(例如通過觸發器)。但是,可能無需觸發就可以滿足您的業務邏輯。外部程序不適用於運行shell腳本。
外部程序需要更多的努力來協調數據庫組件。這在發佈應用程序的新版本並執行備份時適用。當(比如說)開發環境和現場環境處於不同的平臺上時,它們也會很麻煩。
將數據庫摔成執行任意代碼是一個非常糟糕的主意。在大多數情況下,所有需要的是將參數傳遞給可執行文件的機制。
這個問題很混亂。你想從平面文件腳本中將信息添加到Oracle數據庫中?這個決定的安全和設計問題讓我頭暈目眩。讓我們知道你實際上想要做什麼,而不是描述你做了什麼。這可能有幫助。 – wlangstroth 2010-05-19 03:53:21
那麼,只要在一個表中插入一行,其中有一個ROW-Level觸發器實現,那麼觸發器就會被觸發,並且它會訪問一個pl sql代碼,它訪問一個腳本文件(即硬盤)。 – AGeek 2010-05-19 04:07:51
我們可以通過普通的INSERT查詢在數據庫中添加信息,但是插入後會觸發一個觸發器,這會執行上述可能的操作。 – AGeek 2010-05-19 04:09:11