原文: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;
/

Oracle如何限制非法调用包中过程相关推荐

  1. PL/SQL -- 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

  2. oracle timestamp比较大小_ORACLE包和过程依赖关系测试

    一.概念 如果一个对象的定义中引用了其他对象,那么此对象被称为依赖对象(dependent object),此对象所引用的对象被称为引用对象(referenced object).为了管理方案对象(s ...

  3. java调用包中的类_java调用另一个包中的类的方法

    java调用另一个包中的类的方法 发布时间:2020-05-18 15:04:40 来源:亿速云 阅读:199 作者:小新 今天小编给大家分享的是java调用另一个包中的类的方法,相信很多人都不太了解 ...

  4. python调用包中的方法_python 中不同包 类 方法 之间的调用详解

    目录结构如下: 在hello.py中导入ORM.py这个文件的时候,采用 import ORMPackage.ORM 或者 import ORM u = User(id = 123, name='co ...

  5. python什么是调用_Python中包(package)的调用方式

    一.什么是Python Package 如何区分你看到的目录是一个Python Package包呢?其实很简单,你只要看这个名录下是否有"__init__.py"这个文件就好了,如 ...

  6. Oracle 存储过程,函数和包。

    1. 存储过程和函数 1.1 创建和删除存储过程             创建存储过程,需要有CREATE PROCEDURE 或 CREATE ANY PROCEDURE的系统权限. 基本语法如下: ...

  7. Oracle PL/SQL编程之包(packages)

    1.简介 包用于在逻辑上组合过程和函数,它由包规范和包体组成. 我们可以使用create package来创建包,代码如下: ok,包创建完成,通过包的代码发现包的功能就是申明包中包含的过程和方法,红 ...

  8. 二十三、oracle pl/sql分类三 包

    包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成. 1).我们可以使用create package命令来创建包,如: i.创建一个包sp_package ii.声明该包有一个过程update_ ...

  9. Oracle编程入门经典 第11章 过程、函数和程序包

    目录 11.1          优势和利益... 1 11.2          过程... 1 11.2.1       语法... 2 11.2.2       建立或者替换... 2 11.2 ...

最新文章

  1. linux usb初始化
  2. 4.空悬指针和野指针
  3. 初赛问题求解及选择题数学相关整理
  4. 五年级信息技术上册教案计算机主机探秘,第1课信息与信息技术探秘教案
  5. Java hdfs连接池_Java使用连接池管理Hdfs连接
  6. Social Dialogue征集IT意见领袖和优秀博客的RSS地址
  7. vue 第二天(常用指令及插值语法)
  8. 网站技术架构发展之我见--[引子]
  9. 互联⽹名词⼤全——商业模式篇
  10. 计算机策略 提高网速,win10增加网速的方法_win10如何提高电脑网速
  11. java 读取Excel(.xls格式)
  12. Android---ADB工具连接真实手机(有线连接与无线连接)
  13. gitlab设置自动备份
  14. matlab计算wsn覆盖率,WSN覆盖率求解
  15. 常用的sql语句,sql使用大全
  16. 网络科学引论和导论网络传播章节阅读
  17. Mysql当前时间是否在4月活动时间范围内
  18. httphttps ---抓包工具 Fiddlerwireshark
  19. 世事洞明皆学问,人情练达即文章
  20. python的词法结构(行、注释、文件编码、标识符、关键字和字面值)

热门文章

  1. python操作微信电脑版_python 通过微信发送消息控制电脑
  2. windows黑客编程系列(十一):按键记录
  3. 记事本编写的html乱码,记事本编写的HTML文件,用浏览器打开乱码
  4. Altiverb混响试听:让你的声音置身于传奇环境中
  5. 移动办公领域需求分析
  6. Unity 0.Interactive Tutorials
  7. 如何实现修改c语言题库,编程培训 所有C语言题库(修改后).docx
  8. 布尔教育 mysql高级_布尔教育 Mysql高级 燕十八
  9. 伯南克回忆2008:金融危机如何演变为经济危机?------From凤凰财经20160430
  10. 经济危机下我国玩具业现状与前景