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;
/
相關文章
- Sqlsugar呼叫Oracle的儲存過程SqlSugarOracle儲存過程
- Oracle 儲存過程分頁 + Sqlsugar呼叫Oracle儲存過程SqlSugar
- ibatis呼叫oracle儲存過程(極簡版)BATOracle儲存過程
- mysql如何呼叫儲存過程MySql儲存過程
- jsp中呼叫儲存過程JS儲存過程
- Springboot呼叫Oracle儲存過程的幾種方式Spring BootOracle儲存過程
- Servlet呼叫過程Servlet
- 呼叫儲存過程儲存過程
- linux呼叫儲存過程Linux儲存過程
- Winform呼叫儲存過程ORM儲存過程
- oracle索引核心過程Oracle索引
- Oracle儲存過程Oracle儲存過程
- Oracle非法日期 處理方案Oracle
- 4.5 通過SRVCTL 呼叫Oracle RestartOracleREST
- 如果在一個過程中得到上級呼叫它的過程的資訊
- 【圖文】函式呼叫過程中棧的變化函式
- 函式棧幀(呼叫過程)函式
- Google遠端過程呼叫-GRPCGoRPC
- 系統呼叫篇——3環層面呼叫過程
- 非法詞彙過濾
- mssql 儲存過程呼叫另一個儲存過程中的結果的方法分享SQL儲存過程
- oracle邏輯讀過程Oracle
- oracle的儲存過程Oracle儲存過程
- Oracle儲存過程-1Oracle儲存過程
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- 在小程式後端中轉獲取介面資料,繞過前端呼叫限制後端前端
- Sql Server 資料庫中呼叫dll檔案的過程SQLServer資料庫
- Runtime原始碼 方法呼叫的過程原始碼
- RPC(遠端過程呼叫)詳解RPC
- __arm_smmu_tlb_sync呼叫過程
- 系統呼叫篇——0環層面呼叫過程(上)
- 系統呼叫篇——0環層面呼叫過程(下)
- Oracle儲存過程中定義多個遊標Oracle儲存過程
- Oracle儲存過程中跳出迴圈的寫法Oracle儲存過程
- oracle 19c dg搭建duplicate過程中報錯Oracle
- Oracle 遷移到 OB 過程中的函式改造案例Oracle函式
- npm包使用過程中遇到的坑,長期更~NPM
- go 如何呼叫 sqlserver 帶傳出引數的儲存過程GoSQLServer儲存過程
- 如何限制ip訪問Oracle資料庫Oracle資料庫