listener.ora中PLSExtPro 和ExtProc的作用(轉)



默認安裝時,會安裝一個PL/SQL外部程序(ExtProc)條目在listener.ora中,是oracle為調用外部程序默認配置的監聽,它的名字通常是ExtProc或PLSExtProc,但一般不會使用它,可以直接從listener.ora中將這項移除,因為對ExtProc已經有多種攻擊手段了,在不使用外部程序時,oracle也是建議刪除的。

PLSExtPro 是pl/sql   external  procdure 的意思,就是在pl/sql中調用外部語句,如c,java寫的過程。

現在,Oracle已經全面支持JAVA了,這東西也就過時了,之所以繼續保留是考慮到兼容以前老版本的數據庫實例。

 有時可能會在多個數據庫實例之間拷貝listener.ora,請檢查拷貝來的文件中是否含有不需要的服務,確保只留下的確需要的服務項目,減少監聽器受攻擊的面。

http://blog.chinaunix.net/uid-23177306-id-2531135.html

典型的listener.ora 文件內容:

SID_LIST_LISTENER =   (注冊到監聽器的service name所在區域)
  (SID_LIST =
    (SID_DESC =       (對外部過程調用的服務名)
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/product/oracle)
      (PROGRAM = extproc)
    )
  )

LISTENER =     (監聽名稱)
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = franklindb)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))   (對外部過程調用的監聽信息)
    )
  )

-- 備注 --   
     默認安裝時,會安裝一個PL/SQL外部程序(ExtProc)條目在listener.ora中,
是oracle為調用外部程序默認配置的監聽,它的名字通常是ExtProc或PLSExtProc,
但一般不會使用它。可以直接從listener.ora中將這項移除,因為對ExtProc已經有多
種攻擊手段了,在不使用外部程序時,oracle也是建議刪除的。
  PLSExtProc是pl/sql external procdure的意思,就是在pl/sql中調用外部語句,
如c、java寫的過程。現在,Oracle已經全面支持JAVA了,這東西也就過時了,之所以
繼續保留是考慮到兼容以前老版本的數據庫。
  有時可能會在多個數據庫實例之間拷貝listener.ora,檢查拷貝來的文件中是否
含有不需要的服務,確保只留下的確需要的服務項目,減少監聽器受攻擊的面。
http://blog.itpub.net/24419958/viewspace-673107/

tnsnames.ora默認會有如下內容
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
這個主要用於調用外部過程。如使用全文檢索時就需要設置EXTPROC_CONNECTION_DATA
一般對我們是沒啥用的

http://zhidao.baidu.com/link?url=IadLwPA4XM6C2K26tf8qKgplbB5eJZvMukPfpCBTpw1Ro17PhADnWsPwh515aZyooViYKeCTokh3Vyqeqc92fq



在編程過程中,我們可能會發現有些功能通過PL/SQL完成會很麻煩,而通過C/C++語言編程則會容易很多。因此,Oracle提供了在PL/SQL程序里直接調用外部函數(包括C函數或Java方法)的功能。調用外部函數的過程如下:
——用戶進程執行PL/SQL程序。
——在執行的PL/SQL程序過程中,調用了一個C/C++語言寫的函數:c_func。這里需要借助別名庫(Alias Library)。別命苦是數據庫里的一個對象,用來描述一個外部函數所在的動態鏈接庫的路徑和名稱。通過別名庫,從而可以知道調用的外部函數在哪個文件里。
——PL/SQL將對外部函數的調用請求發給監聽器。
——監聽器生成一個extproc進程,該進程專門用來處理對外部函數的調用。每個session都會生成一個屬於該session的extproc進程,並且在整個session生命周期里,extproc進程會一直存在。
——Extproc進程負責將別名庫所指定的動態鏈接庫文件加載到內存。
——Extproc進程執行指定的外部函數,並將結果返回給服務器進程,進而返回給用戶進程。
需要對監聽器進行配置(在listener.ora文件中配置),從而啟動extproc進程。其中“(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0))”說明監聽extproc進程請求的地址;而SID_DESC部分則說明extproc進程的連接信息。
然后我們還要配置tnsnames.ora文件,注意,該文件也必須位於數據庫服務器端(應該是說,tnsname.ora文件的以下內容屬於數據庫客戶端的)。我們需要添加如下內容:
EXTPROC_CONNECTION_DATA=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0))
)
(CONNECT_DATA=
(SID=PLSExtProc)
)
)
配置完畢以后,可以嘗試tnsping 連接字符串名稱,如果成功,則說明監聽沒有問題。
[oracle@book admin]$ tnsping EXTPROC_CONNECTION_DATA
下面用例子說明上面內容。
接下來,我們創建一個C語言編寫的函數,如下:
[oracle@book ~]$ vi calc_tax.c
calc_tax(n)
int n;
{
int tax;
tax=(n*15)/100;
return(tax);
}
該函數完成的功能非常簡單,計算傳入參數的15%,並作為稅額返回給調用者。
將calc_tax.c文件編譯成動態鏈接庫,並將生成的庫文件復制到$ORACLE_HOME/bin目錄下:
[oracle@book ~]$ cc -shared -o calc_tax.so calc_tax.c
[oracle@book ~]$ cp calc_tax.so $ORACLE_HOME/bin
然后,我們創建一個別名庫,用來說明將要調用的C函數所在的庫文件,並將使用c_code別名庫的權限賦給HR用戶:
SQL> connect / as sysdba
SQL> create or replace library c_code as '$ORACLE_HOME/bin/calc_tax.so';
2 /
SQL> grant execute on c_code to hr;
要使用這個calc_tax函數,還需要在數據庫里創建一個調用聲明。如下所示:
SQL> connect hr/hr
SQL> create or replace function call_c
2 (x binary_integer)
3 return binary_integer
4 as language c
5 library sys.c_code
6 name "calc_tax";
7 /
在調用聲明里定義了calc_tax函數的傳入傳出參數、所在的別名庫名稱(library sys.c_code 部分)以及在動態鏈接庫中的函數名(name "calc_tax")等。
現在,我們就可以通過調用call_c,進而調用calc_tax函數了。如下所示:
SQL> set serveroutput on
SQL> var v_salary number;
SQL> var v_tax number;
SQL> exec :v_salary := 10000;
SQL> exec :v_tax := call_c(:v_salary);
SQL> print v_tax;
V_TAX
-----------
1500
從返回結果可以看到,我們成功調用了C函數calc_tax。
http://blog.csdn.net/haiross/article/details/12912195

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM