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;
/
Oracle如何限制非法调用包中过程相关推荐
- PL/SQL -- 动态SQL调用包中函数或过程
动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...
- oracle timestamp比较大小_ORACLE包和过程依赖关系测试
一.概念 如果一个对象的定义中引用了其他对象,那么此对象被称为依赖对象(dependent object),此对象所引用的对象被称为引用对象(referenced object).为了管理方案对象(s ...
- java调用包中的类_java调用另一个包中的类的方法
java调用另一个包中的类的方法 发布时间:2020-05-18 15:04:40 来源:亿速云 阅读:199 作者:小新 今天小编给大家分享的是java调用另一个包中的类的方法,相信很多人都不太了解 ...
- python调用包中的方法_python 中不同包 类 方法 之间的调用详解
目录结构如下: 在hello.py中导入ORM.py这个文件的时候,采用 import ORMPackage.ORM 或者 import ORM u = User(id = 123, name='co ...
- python什么是调用_Python中包(package)的调用方式
一.什么是Python Package 如何区分你看到的目录是一个Python Package包呢?其实很简单,你只要看这个名录下是否有"__init__.py"这个文件就好了,如 ...
- Oracle 存储过程,函数和包。
1. 存储过程和函数 1.1 创建和删除存储过程 创建存储过程,需要有CREATE PROCEDURE 或 CREATE ANY PROCEDURE的系统权限. 基本语法如下: ...
- Oracle PL/SQL编程之包(packages)
1.简介 包用于在逻辑上组合过程和函数,它由包规范和包体组成. 我们可以使用create package来创建包,代码如下: ok,包创建完成,通过包的代码发现包的功能就是申明包中包含的过程和方法,红 ...
- 二十三、oracle pl/sql分类三 包
包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成. 1).我们可以使用create package命令来创建包,如: i.创建一个包sp_package ii.声明该包有一个过程update_ ...
- Oracle编程入门经典 第11章 过程、函数和程序包
目录 11.1 优势和利益... 1 11.2 过程... 1 11.2.1 语法... 2 11.2.2 建立或者替换... 2 11.2 ...
最新文章
- linux usb初始化
- 4.空悬指针和野指针
- 初赛问题求解及选择题数学相关整理
- 五年级信息技术上册教案计算机主机探秘,第1课信息与信息技术探秘教案
- Java hdfs连接池_Java使用连接池管理Hdfs连接
- Social Dialogue征集IT意见领袖和优秀博客的RSS地址
- vue 第二天(常用指令及插值语法)
- 网站技术架构发展之我见--[引子]
- 互联⽹名词⼤全——商业模式篇
- 计算机策略 提高网速,win10增加网速的方法_win10如何提高电脑网速
- java 读取Excel(.xls格式)
- Android---ADB工具连接真实手机(有线连接与无线连接)
- gitlab设置自动备份
- matlab计算wsn覆盖率,WSN覆盖率求解
- 常用的sql语句,sql使用大全
- 网络科学引论和导论网络传播章节阅读
- Mysql当前时间是否在4月活动时间范围内
- httphttps ---抓包工具 Fiddlerwireshark
- 世事洞明皆学问,人情练达即文章
- python的词法结构(行、注释、文件编码、标识符、关键字和字面值)
热门文章
- python操作微信电脑版_python 通过微信发送消息控制电脑
- windows黑客编程系列(十一):按键记录
- 记事本编写的html乱码,记事本编写的HTML文件,用浏览器打开乱码
- Altiverb混响试听:让你的声音置身于传奇环境中
- 移动办公领域需求分析
- Unity 0.Interactive Tutorials
- 如何实现修改c语言题库,编程培训 所有C语言题库(修改后).docx
- 布尔教育 mysql高级_布尔教育 Mysql高级 燕十八
- 伯南克回忆2008:金融危机如何演变为经济危机?------From凤凰财经20160430
- 经济危机下我国玩具业现状与前景