Oracle如何限制非法呼叫包中過程

2021-07-03 12:52:33 字數 1795 閱讀 7435

原文:

假如我有乙個包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

–再次呼叫發現

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;

/

如何防止webservice被非法呼叫

為了使.a x控制代碼有可能反序列化soap頭,首先你需要定義乙個.net類,它代表了暗含的xml schema類。在此例中相應的類如下 然後你需要在webmethod類中定義乙個成員變數來控制乙個頭類的例項,同樣要為webmethods標記 soapheader 屬性。見如下 using syst...

oracle 包 及 包呼叫

建立包頭 create package testpack 建立乙個包頭,裡面定義變數和方法名稱,方法引數,返回值型別 is v tax number v s number function tax v money number return number function addd v a numb...

談如何使用C 呼叫SSIS包

上次轉過一篇關於如何使用c 呼叫ssis包的文章,但其平台是舊版本的。現在講的是如下平台 windows2003 r2 sp2 sql server 2005 加所有最新補丁 vs 2005 professional edition。首先應該加入引用 c program files microsof...