原文:
假如我有乙個包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...