강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
PL/SQL코드 숨기기(wrap유틸리티 사용)
조회 : 6,700  


PL/SQL코드 숨기기(wrap유틸리티 사용)

 

작성자: 강명규
OS: Linux 2.4.18
Oralce: Oracle EE 8.1.7

보통 패키지 스펙의 정의(create or replace package..)는 .sql로,
패키지 body의 정의(create or replace package body ..)는 .plb확장자를 가지며 존재한다.
여기서 .sql은 당연히 pl/sql코드이다. 그러면 .plb는 무엇일까?
이것은 wrap유틸리티에 의해 pl/sql의 소스코드가 암호화(encrypt)된 것을 의미한다.
wrap에 의해 처리되더라도 실제 text로 되어 볼 수는 있지만, 암호화되어 있으므로 소스를 파악할 수는 없다.

C언어에 연관하여 보면, include파일은 일반 텍스트로 되어 있어 함수들의 선언부를 통해 제공되는
함수가 어떤 것들이 있는지 파악할 수 있다. 하지만, 함수의 정의부분인 C소스파일은 컴파일후 라이브러리로
만들어 소스의 내용을 감추는 것과 같다고 하겠다. 

따라서, .sql파일에 패키지 스펙의 정의부분을 두어 제공되는 프로시저, 함수들을 사용자들이 알 수 있게 하고,
패키지 body의 소스부분은 wrap으로 감추어 사용자는 단지 제공되는 패키지의 함수나 프로시저에 대한 사용만
하면 되는 것이다.

왜 암호화하는 것이 필요한 것일까? 다음과 같은 이유가 있을 것이다.

1. 다른 개발자의 PL/SQL 소스변경으로 발생할 수 있는 껀덕지(^^) 제거
2. 사용된 알고리즘을 보여주고 싶지 않다.


설명이 길어졌는데(?) 예를 통해 알아보자.
우선, 간단한 pl/sql코드를 가지고 테스트하겠다.

[kang@ns oracle]$ cat test.sql
create or replace procedure proc_dbakorea_test
is
begin
 dbms_output.put_line('This sample comes from dbakorea.pe.kr');
end;
/ 
[kang@ns oracle]$ wrap iname=test

PL/SQL Wrapper: Release 8.1.7.0.0 - Production on Thu Sep 26 17:44:17 2002

Copyright (c) Oracle Corporation 1993, 2000.  All Rights Reserved.

Processing test.sql to test.plb
[kang@ns oracle]$ sqlplus xxxxx/xxxxx

SQL*Plus: Release 8.1.7.0.0 - Production on Thu Sep 26 17:44:23 2002

(c) Copyright 2000 Oracle Corporation.  All rights reserved.


Connected to:
Oracle8i Enterprise Edition Release 8.1.7.0.1 - Production
With the Partitioning option
JServer Release 8.1.7.0.1 - Production

SQL> @test.plb

Procedure created.

SQL> set serveroutput on
SQL> exec proc_dbakorea_test;
This sample comes from dbakorea.pe.kr

PL/SQL procedure successfully completed.

SQL> 

wrap은 상위호환성을 가지므로 하위버전의 오라클에서 컴파일된 plb파일도 상위버전에게 적용될 수 있다. 
즉, 8.1.5에서 컴파일된 plb파일도 8.1.7에서 사용될 수 있다는 것이다.
그럼, 실제 패키지에 대해 간단하게 적용해 보자. 이전에 설명된 pkg_dbakorea패키지를 그대로 사용하겠다.

[kang@ns oracle]$ cat > pkg_dbakorea.sql
create or replace package pkg_dbakorea
as
procedure insert_test(v_id IN TEST.ID%type, v_name IN TEST.NAME%type); 
function print_date return varchar;
end;
/
[kang@ns oracle]$ cat > pkg_dbakorea_body.sql
create or replace package body pkg_dbakorea
as
 procedure insert_test
 (                                                
  v_id    IN TEST.ID%type,  -- ID                 
  v_name  IN TEST.NAME%type  -- 이름              
 )                                                
 is                                               
 begin                                            
  insert into test(id, name) values(v_id, v_name);
  commit;                                         
 end;                                             
 
 function print_date return varchar is
  cur_date varchar(15);                                         
 begin                                                          
  select to_char(sysdate, 'YYYY-MM-DD') into cur_date from dual;
  return cur_date;                                              
 end print_date;                                                

end;
/
[kang@ns oracle]$ wrap iname=pkg_dbakorea_body.sql oname=pkg_dbakorea.plb

PL/SQL Wrapper: Release 8.1.7.0.0 - Production on Thu Sep 26 17:50:22 2002

Copyright (c) Oracle Corporation 1993, 2000.  All Rights Reserved.

Processing pkg_dbakorea_body.sql to pkg_dbakorea.plb
[kang@ns oracle]$ sqlplus xxxxx/xxxxxx

SQL*Plus: Release 8.1.7.0.0 - Production on Thu Sep 26 17:50:34 2002

(c) Copyright 2000 Oracle Corporation.  All rights reserved.


Connected to:
Oracle8i Enterprise Edition Release 8.1.7.0.1 - Production
With the Partitioning option
JServer Release 8.1.7.0.1 - Production

SQL> @pkg_dbakorea.sql

Package created.

SQL> @pkg_dbakorea.plb

Package body created.

SQL> select pkg_dbakorea.print_date() from dual;

PKG_DBAKOREA.PRINT_DATE()
--------------------------------------------------------------------------------


Copyleft(C) 명규의 DBAKOREA All rights free 

[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=754


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
(주) 수퍼유저