Implement SecureFile LOB

1. Documentación en Tahiti -> Oracle Database, 11g Release 2 (11.2) -> Masters Book List -> SecureFiles and Large Objects Developer’s Guide -> 4 Using Oracle SecureFiles LOBs

2. El concepto de SECUREFILE es bastante confuso. La intución te dice que se trata de un tipo de fichero encriptado, y aunque no es del todo falso, la intuición no refleja del todo lo que hay detrás de esta funcionalidad. SECUREFILE es una arquitectura de almacenamiento que se introdujo con la versión 11.1 que permite almacenar objetos grandes (LOB) con una serie de ventajas: compresión, deduplicación y encriptación. Al mecanismo antiguo, que aún se puede usar, se le llama BASICFILE. Cuando creamos una tabla, si no especificamos lo contrario, el almacenamiento por defecto utiliza BASICFILE.

Cabe recordar qué es un objeto LOB (Large OBject). Es un tipo de datos que nos permite almacenar entre 8TB y 128TB de datos (en función del tamaño de bloque de la BD). Oracle se encarga de almacenar los datos de forma eficiente según la arquitectura que escojamos (BASICFILE o SECUREFILE). Un requisito fundamente de SECUREFILE es que el TABLESPACE donde se cree debe ser de tipo ASSM.

3. Podemos indicar los parámetros de almacenamiento SECUREFILE en la propia sentencia de creación de la tabla (CREATE TABLE), o una vez creada (ALTER TABLE). Se recomienda tener claro estos atributos durante la creación, ya que si se modifica después, la BD provoca un bloqueo en la tabla que puede durar bastante tiempo.

-- Creamos una tabla con SECUREFILE LOB (campos LOB almacenados con SECUREFILE)
-- Utilizamos el esquema PM
--   · En ambos campos LOB (BLOB Y CLOB) utilizamos COMPRESSION, ENCRYPT y DEDUPLICATE
--   · Si no especificamos nada, por defecto es NOCOMPRESS, DECRYPT y KEEP_DUPLICATES
--   · Si no especificamos SECUREFILE se crearía como BASICFILE
--   · Para utilizar la encriptación debemos tener activado TDE (Transparent Data Encryption)
CREATE TABLE PRINT_MEDIA_TEST (
  PRODUCT_ID    NUMBER(6),
  AD_ID         NUMBER(6),
  AD_COMPOSITE  BLOB,
  AD_SOURCETEXT CLOB)
TABLESPACE USERS
LOB (AD_COMPOSITE) STORE AS SECUREFILE (
  CACHE
  ENCRYPT
  COMPRESS
  DEDUPLICATE)
LOB (AD_SOURCETEXT) STORE AS SECUREFILE(
  CACHE
  ENCRYPT
  COMPRESS
  DEDUPLICATE);

-- Podemos cambiar los atributos de las columnas SECUREFILE LOB después de la creación de la tabla
ALTER TABLE PRINT_MEDIA_TEST MODIFY LOB (AD_COMPOSITE) (KEEP_DUPLICATES);
ALTER TABLE PRINT_MEDIA_TEST MODIFY LOB (AD_COMPOSITE) (NOCOMPRESS);
ALTER TABLE PRINT_MEDIA_TEST MODIFY LOB (AD_COMPOSITE) (DECRYPT);

4. Existe un parámetro en la BD que controla el comportamiento por defecto cuando creamos un tabla con campos LOB. El parámetro DB_SECUREFILE nos permite configurar el tipo de almacenamiento por defecto, BASICFILE o SECUREFILE. Por defecto tiene el valor PERMITTED, lo que “permite” crear campos SECUREFILE, pero por defecto se crean como BASICFILE. Veamos el resto de valores posibles:

· NEVER: Todo LOB se crea como BASICFILE, provocando un error si se especifica SECUREFILE
· PERMITTED: Por defecto un LOB se crea como BASICFILE pero podemos utilizar SECUREFILE
· ALWAYS: Se fuerza la utilización de SECUREFILE aunque se especifique lo contrario
· IGNORE: Se ignora la clausula SECUREFILE y todas sus opciones sin provocar error

-- Comprobamos el valor del parámetro DB_SECUREFILE
SHOW PARAMETER DB_SECUREFILE

-- Modificamos el valor para nuestra sesión
ALTER SESSION SET DB_SECUREFILE=ALWAYS;

- Creamos un tabla de ejemplo para ver si utiliza SECUREFILE por defecto
CREATE TABLE PRINT_MEDIA_TEST2 (
  PRODUCT_ID    NUMBER(6),
  AD_ID         NUMBER(6),
  AD_COMPOSITE  BLOB,
  AD_SOURCETEXT CLOB);

-- Comprobamos si se ha creado de tipo SECUREFILE
COL COLUMN_NAME FORMAT A20;
SELECT  COLUMN_NAME, SECUREFILE, ENCRYPT, DEDUPLICATION, COMPRESSION
  FROM USER_LOBS WHERE TABLE_NAME='PRINT_MEDIA_TEST2';

5. Crear tablas con SecureFiles a través de Enterprise Manager es una operación muy sencilla. Veamos como implementar el ejemplo anterior con EM.

En la página principal de OCM ->
-> Click “Schema” ->
-> Click “Tables” ->
-> Click “Create” ->
-> Seleccionamos “Standard (Heap Organized) ->
-> Click “Continue” ->
-> Name = “PRINT_MEDIA_TEST3” ->
-> Schema = “HR” ->
-> Tablespace = “USERS” ->
-> Rellenamos las columnas de la siguiente forma ->
-> Name: “PRODUCT_ID”, Data Type=”NUMBER”, Size=6 ->
-> Name: “AD_ID”, Data Type=”NUMBER”, Size=6 ->
-> Name: “AD_COMPOSITE”, Data Type=”BLOB” ->
-> Name: “AD_SOURCETEXT”, Data Type=”CLOB” ->
-> Seleccionamos “AD_COMPOSITE” ->
-> Click “Advanced Attributes” ->
-> Seleccionamos SecureFile ->
-> Cache = “CACHE” ->
-> Compression = “Medium” ->
-> Seleccionamos “Deduplicate” ->
-> Click “Continue” ->
-> Hacemos lo mismo con la columna AD_SOURCETEXT ->
-> Seleccionamos “AD_SOURCETEXT” ->
-> Click “Advanced Attributes” ->
-> Seleccionamos SecureFile ->
-> Cache = “CACHE” ->
-> Compression = “Medium” ->
-> Seleccionamos “Deduplicate” ->
-> Click “Continue” ->
-> Click “OK” ->
-> Click “PRINT_MEDIA_TEST3” ->
-> Click “Edit” ->
-> Marcamos las columnas AD_COMPOSITE y AD_SOURCETEXT como “Encrypted” ->
-> Click “Apply”