2010-05-19 82 views
-1

讓我們考慮一個Table STUD和一個行級TRIGGER是通過INSERT查詢來實現的。我的情況是這樣的,無論何時插入一行,都會觸發一個觸發器,並且它應該訪問某個放置的腳本文件在硬盤上,最終應該打印結果。那麼,這是可能的嗎?如果是,那麼這個東西應該以動態的形式存在,即如果我們改變了腳本文件的內容,那麼oracle也應該反映這些改變。Oracle觸發器查詢

我已經嘗試過使用外部過程對java執行此操作,但是對於我想要的結果並不滿意。

請給出您對這種場景的觀點以及可以實施的方式。

+0

這個問題很混亂。你想從平面文件腳本中將信息添加到Oracle數據庫中?這個決定的安全和設計問題讓我頭暈目眩。讓我們知道你實際上想要做什麼,而不是描述你做了什麼。這可能有幫助。 – wlangstroth 2010-05-19 03:53:21

+0

那麼,只要在一個表中插入一行,其中有一個ROW-Level觸發器實現,那麼觸發器就會被觸發,並且它會訪問一個pl sql代碼,它訪問一個腳本文件(即硬盤)。 – AGeek 2010-05-19 04:07:51

+0

我們可以通過普通的INSERT查詢在數據庫中添加信息,但是插入後會觸發一個觸發器,這會執行上述可能的操作。 – AGeek 2010-05-19 04:09:11

回答

4

一個社區wiki,爲什麼這是一個壞主意。

爲什麼使用動態代碼文件的原因是愚蠢的。

  1. 插入的每一行都必須打開一個文件,讀取整個內容,解析它並對結果做一些事情。這將是緩慢的。

  2. 根據操作系統環境的不同,您可能無法同時打開文件進行讀取和寫入。所以你可能會發現你必須關閉數據庫才能將代碼更改「提升」到文件中。

  3. 根據操作系統環境,您甚至可能會發現一次只能從該文件讀取一個會話。

  4. 也許觸發器會在'保存'中讀取文件並執行部分代碼。

  5. 文件安全性將與數據庫安全性完全分離,造成維護頭痛。

簡而言之,將動態代碼存儲在一個表格中,而不是一個文件,將是一個巨大的改進。

  1. 動態代碼沒有被解析/編譯:

    原因,你不應該反正使用動態代碼。所以它可能無法正常工作,直到它被執行時纔會發現。

  2. 由於減少了解析開銷,因此靜態代碼的性能優於動態代碼。

Misc。原因

  1. 有一個行級觸發器讀取和執行的代碼意味着,有可能,相同的語句插入多條記錄到表中可以拿起不同版本的代碼來執行不同的行插入。
1

如果我想訪問一個文件的sh, 這是做一些OS處理

有從數據庫中執行OS的三種方式。

  1. 外部過程,它們是用C或Java編寫的OS庫的PL/SQL包裝。自Oracle 8.0起可用。 Find out more

  2. 模擬host命令的Java存儲過程。這是Java Runtime的手卷包裝。該命令將以oracle OS用戶的強大特權執行,因此不要將此過程暴露給一般用途。取而代之的是安全用戶擁有它,並編寫存儲過程以公開特定的OS功能片段(例如執行mkdir的過程,執行ls的功能)。可能從Oracle 8i開始。 Find out more

  3. DBMS_SCHEDULER。除了後臺數據庫作業,我們還可以使用計劃運行的OS作業。自Oracle 10g起可用。 Find out more

這三個選項中,DBMS_SCHEDULER可能是最安全的選擇。顧名思義,它的目的是定時運行程序(如unix cron),所以它不適合按需運行(例如通過觸發器)。但是,可能無需觸發就可以滿足您的業務邏輯。外部程序不適用於運行shell腳本。

外部程序需要更多的努力來協調數據庫組件。這在發佈應用程序的新版本並執行備份時適用。當(比如說)開發環境和現場環境處於不同的平臺上時,它們也會很麻煩。

將數據庫摔成執行任意代碼是一個非常糟糕的主意。在大多數情況下,所有需要的是將參數傳遞給可執行文件的機制。