Oracle如何限制非法呼叫包中過程
原文:http://www.oracle.com/technetwork/issue-archive/2015/15-jan/o15plsql-2398996.html
假如我有一個包P_A,其中封裝了重要過程DO_A。
另有一個包P_B需要呼叫P_A.DO_A實現重要商業邏輯。
我想只授權給包P_B呼叫,認為其他途徑呼叫P_A.DO_A都是非法的!
下面根據PL/SQL開發大師[福伊爾斯坦]提供的方法實現如下:
CREATE OR REPLACE PACKAGE p_a IS
PROCEDURE do_a;
END p_a;
/
CREATE OR REPLACE PACKAGE BODY p_a IS
PROCEDURE do_a IS
BEGIN
dbms_output.put_line(‘DO_A FROM P_A’);
END do_a;
END p_a;
/
CREATE OR REPLACE PACKAGE P_B
IS
PROCEDURE DO_B;
END P_B;
/
CREATE OR REPLACE PACKAGE BODY P_B
IS
PROCEDURE DO_B
IS
BEGIN
P_A.DO_A;
END DO_B;
END P_B;
/
BEGIN
P_A.DO_A; –被認為是非法呼叫
P_B.DO_B; –唯一合法呼叫
END;
/
–如何限制只有P_B可呼叫P_A.DO_A?
–12c以前,我們使用DBMS_UTILITY .FORMAT_CALL_STACK
–編寫自定義函式:
CREATE OR REPLACE FUNCTION i_was_called_by (program_in IN VARCHAR2)
RETURN BOOLEAN
IS
c_stack CONSTANT VARCHAR2 (32767)
:= DBMS_UTILITY.format_call_stack;
BEGIN
RETURN INSTR (SUBSTR (c_stack,
INSTR (c_stack,
CHR (10),1,5)+ 1,
INSTR (c_stack, CHR (10),1,6)
- INSTR (c_stack,CHR (10),1,5)
+ 1),
program_in) > 0;
END;
—– PL/SQL Call Stack —–
object line object
handle number name
000007FF50456200 4 function SCOTT.I_WAS_CALLED_BY
000007FF504ADD28 4 package body SCOTT.P_A
000007FF50439820 2 anonymous block
–修改P_A.DO_A過程:
PROCEDURE DO_A
IS
BEGIN
IF i_was_called_by (‘P_B’)
THEN
dbms_output.put_line(‘DO_A FROM P_A’);
ELSE
RAISE_APPLICATION_ERROR(-20209, ‘非法呼叫!’);
END IF;
END;
/
–再次呼叫發現
BEGIN
*
第 1 行出現錯誤:
ORA-20209: 非法呼叫!
ORA-06512: 在 “SCOTT.P_A”, line 7
ORA-06512: 在 line 2
–12c以後,我們使用包的ACCESSIBLE BY條件
–修改包P_A說明部分
CREATE OR REPLACE PACKAGE p_a
ACCESSIBLE BY(P_B)
IS
PROCEDURE do_a;
END p_a;
/
相關文章
- java中呼叫ORACLE儲存過程JavaOracle儲存過程
- Jsp中呼叫Oracle儲存過程JSOracle儲存過程
- java 呼叫oracle 儲存過程JavaOracle儲存過程
- mysql如何呼叫儲存過程MySql儲存過程
- PB中呼叫儲存過程儲存過程
- java中呼叫儲存過程Java儲存過程
- C#呼叫 oracle儲存過程C#Oracle儲存過程
- C#呼叫Oracle儲存過程C#Oracle儲存過程
- 用java呼叫oracle儲存過程JavaOracle儲存過程
- Sqlsugar呼叫Oracle的儲存過程SqlSugarOracle儲存過程
- jsp中呼叫儲存過程JS儲存過程
- oracle goldengate 呼叫儲存過程案例OracleGo儲存過程
- Oracle 儲存過程分頁 + Sqlsugar呼叫Oracle儲存過程SqlSugar
- 觸發器trigger中呼叫包package(包中含:儲存過程procedure及函式function)_plsql觸發器Package儲存過程函式FunctionSQL
- mysql 儲存過程,以及mybatis如何呼叫MySql儲存過程MyBatis
- 用java呼叫oracle儲存過程總結JavaOracle儲存過程
- Java呼叫Oracle儲存過程的問題JavaOracle儲存過程
- 在儲存過程A中呼叫儲存過程B的結果儲存過程
- 函式呼叫發生在SQL呼叫之前還是過程中函式SQL
- Oracle在儲存過程中呼叫其他使用者的表授權Oracle儲存過程
- 呼叫儲存過程儲存過程
- ibatis呼叫oracle儲存過程(極簡版)BATOracle儲存過程
- Hibernate呼叫oracle儲存過程的問題Oracle儲存過程
- oracle父儲存過程呼叫子儲存過程procedure與輸出引數Oracle儲存過程
- ORACLE儲存過程中建立子過程的測試!Oracle儲存過程
- Winform呼叫儲存過程ORM儲存過程
- perl呼叫儲存過程儲存過程
- jdbc呼叫儲存過程JDBC儲存過程
- Oracle9i 中如何限制登陸IPOracle
- 【圖文】函式呼叫過程中棧的變化函式
- 執行遠端DBMS_LOB包中過程
- Springboot呼叫Oracle儲存過程的幾種方式Spring BootOracle儲存過程
- ORACLE包和過程依賴關係測試(轉)Oracle
- 函式棧幀(呼叫過程)函式
- linux呼叫儲存過程Linux儲存過程
- php呼叫mssql儲存過程PHPSQL儲存過程
- EXECUTE IMMEDIATE 呼叫動態過程
- mssql 儲存過程呼叫另一個儲存過程中的結果的方法分享SQL儲存過程