首頁 資料庫 mysql教程 Oracle如何限制非法调用包中过程

Oracle如何限制非法调用包中过程

Jun 07, 2016 pm 03:21 PM
oracle 資料庫

Oracle如何限制非法调用包中过程 假如我有一个包P_A,其中封装了重要过程DO_A。 另有一个包P_B需要调用P_A.DO_A实现重要商业逻辑

Oracle如何限制非法调用包中过程

假如我有一个包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;
/

本文永久更新链接地址

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MySQL:世界上最受歡迎的數據庫的簡介 MySQL:世界上最受歡迎的數據庫的簡介 Apr 12, 2025 am 12:18 AM

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

oracle打不開怎麼辦 oracle打不開怎麼辦 Apr 11, 2025 pm 10:06 PM

Oracle 打不開的解決辦法包括:1. 啟動數據庫服務;2. 啟動監聽器;3. 檢查端口衝突;4. 正確設置環境變量;5. 確保防火牆或防病毒軟件未阻止連接;6. 檢查服務器是否已關閉;7. 使用 RMAN 恢復損壞的文件;8. 檢查 TNS 服務名稱是否正確;9. 檢查網絡連接;10. 重新安裝 Oracle 軟件。

為什麼要使用mysql?利益和優勢 為什麼要使用mysql?利益和優勢 Apr 12, 2025 am 12:17 AM

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

oracle游標關閉怎麼解決 oracle游標關閉怎麼解決 Apr 11, 2025 pm 10:18 PM

解決 Oracle 游標關閉問題的方法包括:使用 CLOSE 語句顯式關閉游標。在 FOR UPDATE 子句中聲明游標,使其在作用域結束後自動關閉。在 USING 子句中聲明游標,使其在關聯的 PL/SQL 變量關閉時自動關閉。使用異常處理確保在任何異常情況下關閉游標。使用連接池自動關閉游標。禁用自動提交,延遲游標關閉。

oracle怎麼循環創建游標 oracle怎麼循環創建游標 Apr 12, 2025 am 06:18 AM

Oracle 中,FOR LOOP 循環可動態創建游標, 步驟為:1. 定義游標類型;2. 創建循環;3. 動態創建游標;4. 執行游標;5. 關閉游標。示例:可循環創建游標,顯示前 10 名員工姓名和工資。

oracle數據庫怎麼停止 oracle數據庫怎麼停止 Apr 12, 2025 am 06:12 AM

要停止 Oracle 數據庫,請執行以下步驟:1. 連接到數據庫;2. 優雅關機數據庫(shutdown immediate);3. 完全關機數據庫(shutdown abort)。

HDFS配置CentOS需要哪些步驟 HDFS配置CentOS需要哪些步驟 Apr 14, 2025 pm 06:42 PM

在CentOS系統上搭建Hadoop分佈式文件系統(HDFS)需要多個步驟,本文提供一個簡要的配置指南。一、前期準備安裝JDK:在所有節點上安裝JavaDevelopmentKit(JDK),版本需與Hadoop兼容。可從Oracle官網下載安裝包。環境變量配置:編輯/etc/profile文件,設置Java和Hadoop的環境變量,使系統能夠找到JDK和Hadoop的安裝路徑。二、安全配置:SSH免密登錄生成SSH密鑰:在每個節點上使用ssh-keygen命令

甲骨文在商業世界中的作用 甲骨文在商業世界中的作用 Apr 23, 2025 am 12:01 AM

Oracle不僅是數據庫公司,還是雲計算和ERP系統的領導者。 1.Oracle提供從數據庫到雲服務和ERP系統的全面解決方案。 2.OracleCloud挑戰AWS和Azure,提供IaaS、PaaS和SaaS服務。 3.Oracle的ERP系統如E-BusinessSuite和FusionApplications幫助企業優化運營。

See all articles