Cuando se lanza un programa, es lógico que no se quiera que se pueda manipular o ver ciertos objetos. Un proceso muy común para evitarlo es la encriptación.
Encriptar un archivo es muy fácil ya que oracle proporciona las herramientas necesarias para ello. Huelga decir que los paquetes, triggers y demás funcionará correctamente aunque se encripte y no sea visible por el usuario. Al encriptar un objeto se pierde su código original, por lo que es necesario guardar el archivo original o tener un repositorio por si se quiere modificar despues de la encriptación.
Encriptar un archivo.sql es bien sencillo. Basta con lanzar por la línea de comandos:

wrap iname=nombre_arch_original.sql oname=nombre_arch_salida.enc

Y ya tenemos el archivo encriptado. Tenemos que hacerlo desde la ruta donde esté el archivo original. Y se creará el archivo en el mismo sitio.

Y aqui es donde vosotros preguntáis, “muy bien, y ¿como lo encripto si lo quiero tener encriptado dentro de la bd?”
Esto se hace con la herramienta SYS.DBMS_DDL.WRAP . Os pondré el script a continuación donde sólo tenéis que sustituir “Tipo_de_objeto” por PACKAGE_BODY o TRIGGER,etc y “Nombre_del_objeto” por el nombre del objeto a encriptar.(Ambos deben de ir en mayúsculas). Bueno, aquí el script y después la explicación paso a paso de lo que estamos haciendo:

(Es importante que se haga con el esquema que contiene el objeto a encriptar, pues hacemos una query sobre user_source)

DECLARE
l_source  DBMS_SQL.VARCHAR2A;

—Recojo nombre_de_objeto
CURSOR CurPkgBody IS
SELECT SRC.LINE, RTRIM(SRC.TEXT) LINEA
FROM USER_SOURCE SRC
WHERE TYPE = ‘Tipo_de_objeto’
AND NAME = ‘Nombre_del_paquete’
ORDER BY LINE ASC;
BEGIN

—Monto las líneas
FOR reg IN CurPkgBody LOOP
IF reg.line = 1 THEN
l_source(reg.line) := ‘CREATE OR REPLACE ‘ || ltrim(reg.linea);
ELSE
l_source(reg.line) := reg.linea;
END IF;
END LOOP;

—Encripto las líneas montadas
SYS.DBMS_DDL.WRAP(ddl => l_source,
lb  => 1,
ub  => l_source.count);
END;
/

El paquete DBMS_SQL nos ayuda a hacer sql dinámico, como por ejemplo estas dos variables que van a almacenar la información del paquete leída desde bd.
Varchar2a es una tabla de varchar, para poder almacenar líneas en esa variable llamada l_source.
Lo primero que hacemos es obtener las líneas de código del objeto a través de la vista user_source. Esta vista nos la proporciona oracle y ofrece todas las líneas de código de todos los objetos. Como filtramos por el tipo de objeto y por el nombre, devuelve justo las líneas de código del objeto que queremos ordenadas correctamente. Ya casi tenemos el código del objeto.
Vamos a montarlo en la variable l_source. A la primera línea hay que añadir el “create or replace” ya que se omite en la vista USER_SOURCE. Las demás líneas las dejamos igual.
Ya tenemos el código del objeto, sólo nos falta lo más importante, encriptarlo. Esto se hace llamando a la función wrap del dbms_dll. Los parámetros recibidos serán:
ddl –> el código a encriptar
lb  –> límite inferior
ub  –> límite superior
Los dos últimos parámetros son para índices. Y ya tenemos el objeto encriptado en el output. Sólo falta compilar ese objeto que aunque pueda parecer extraño, compila correctamente en la base de datos.

Spawn