Tradueix

viernes, 7 de julio de 2017

Variables de sesión en Oracle

En Oracle se pueden crear variables de sesión. De esas cuyo alcance se limita a la sesión que la ha creado y por tanto cuando se cierre la sessión desaparecerà.
Veamos como se crean y en un post posterior veremos alguna posible aplicación práctica a modo de ejemplo:

Primero que nada, como usuario SYS debemos dar permiso al usuario que usemos para poder crear el contexto:

conn / as sysdba

grant create any context to usuario ;
grant execute on sys.dbms_session to usuario ;

Nos conectamos como el susodicho usuario y creamos el contexto :

CREATE OR REPLACE CONTEXT nombre_contexto USING context_package;

Con esto asociamos un nombre "nombre_contexto" a un paquete que vamos a crear a continuación y que le daremos el nombre "context_package" y que contendrá un procedure para instanciar variables dentro del contexto mediante la llamada a la funcion dbms_session.set_context:
  
create or replace package context_package
as
  procedure set_context_value(par in varchar2, val in varchar2);
end avl_context_package;


create or replace package body context_package
as
procedure set_context_value(par in varchar2, val in varchar2)
as
begin
  dbms_session.set_context('nombre_contexto',par,val);
end;
end avl_context_package;


Muy importante: Este problema me provocó verdaderos dolores de cabeza hasta que no lo descubrí. Oracle me devolvía el error ORA-01031: Insufficient privileges sin aparente sentido. Y es que el nombre del contexto que se establece en dbms_session.set_context('nombre_contexto',par,val); debe coincidir con el nombre de creación del contexto:
CREATE OR REPLACE CONTEXT nombre_contexto USING context_package;
Ahora me parece obvio pero, cuando se prueba sin pensar demasiado, no lo es tanto. 

Para añadir una variable y un valor llamaremos al procedure indicándole el valor que queremos asignar a una variable de sesión que queramos instanciar de la siguiente manera:

call CONTEXT_PACKAGE.SET_CONTEXT_VALUE('variable','VALOR');

A partir de ese momento, para consultar el valor de una variable instanciada en la sesión debemos usar la funcion SYS_CONTEXT tal que así:

select SYS_CONTEXT('nombre_contexto', 'variable') from dual;
deberia devolver:
'VALOR'

Nos vemos.

martes, 17 de enero de 2017

Oracle 12c Crear una nueva Pluggable Database

Han cambiado bastantes cosas en Oracle12c. El cambio mas importante sin duda és el nuevo sistema Multitenant que permite una mejor gestión de recursos al compartir algunos de ellos entre diferentes bases de datos alojadas en el mismo servidor, con el consiguiente ahorro.
Este sistema Multinenant conlleva la adopción de nuevos conceptos. Digamos que puedes crear una base de datos como las de toda la vida Non-Container y también puedes crear una base de datos de un nuevo tipo Container DB (CDB). Este nuevo tipo de bd permite alojar varias bases de datos BD en su interior que se llamaran Pluggable BD (PDB). Hay recursos comunes a todas las PDB que se alojaran en el espacio de la CDB contenedora y otros que seguiran en el espacio privado de la PDB. La gracia és que puedes coger una BD normal de Oracle 11, por ejemplo, y "enchufarla" como una PDB. Tambien puedes "desenchufar" una PDB y moverla a otra CDB, etc..  Para el usuario/cliente/app esta gestión es transparente, la conexión con la BD será igual tanto si es una bd PDB o no.

Vamos a ver como creamos una base de datos PDB desde Linux. Por esta vez, suponemos que ya tenemos una CDB creada. Es decir, ya tenemos una bd contenedora y queremos crear una PDB en su "interior". Hay varias maneras de hacerlo: Usando la semilla o clonando una PDB. Esta vez lo haremos usando la semilla puesto que queremos empezar una bd de cero. Suponemos que el SID de la CDB se llamará cdb01 y la PDB pdb01 en un alarde de imaginación.

1. Nos conectamos a la CDB como sysdba:

> export ORACLE_SID=cdb01
> sqlplus / as sysdba

 SQL*Plus: Release 12.1.0.2.0 Production on Tue Jan 17 11:38:10 2017 Copyright (c) 1982, 2014, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

2. Comprobamos que estamos en la bd correcta:
SQL> show con_name
 CON_NAME 
------------------------------ 
CDB$ROOT 

3. Creamos una subcarpeta en la carpeta oradata del servidor donde se alojan los ficheros físicos de la bd:

> cd /u03/oradata/cdb01
> mkdir pdb01

si comprobamos el contenido de la carpeta u03/oradata/cdb01 deberian aparecer las carpetas :
pdb01
pdbseed

usaremos el contenido de pdbseed para crear la bd.


4. Volvemos al SQLPLUS y creamos la bd propiamente dicha con:
CREATE PLUGGABLE DATABASE pdb01 ADMIN USER admin identified by "password_de_admin"
default tablespace users
DATAFILE '/u03/oradata/cdb01/pdb01/users01.dbf'
size 250M AUTOEXTEND ON
FILE_NAME_CONVERT=(
'/u03/oradata/cdb01/pdbseed/',
'/u03/oradata/cdb01/cdb01/');

a lo que deberia responder al cabo de unos segundos:

Pluggable database created.

Comprobamos que se ha hecho correctamente:

SQL> show pdbs 
CON_ID CON_NAME          OPEN MODE RESTRICTED 
----------   ------------------------------ ----------             ---------- 
2            PDB$SEED            READ ONLY  NO 
3            PDB01                    MOUNTED

5. Abrimos la base de datos

 alter pluggable database pdb01 open;

a lo que responde:

Pluggable database altered.

6. Comprobamos que ha cambiado su estado:

SQL> show pdbs 

CON_ID  CON_NAME           OPEN MODE  RESTRICTED 
----------     ------------------------------ ----------             ---------- 
2             PDB$SEED            READ ONLY   NO 
3             PDB01                   READ WRITE NO

7. Opcionalmente crearemos mas tablespaces para alojar diferentes aplicaciones. Es una buena práctica. Se realiza como siempre:

CREATE TABLESPACE tablespaceapp DATAFILE '/u03/oradata/cdb01/pdb01/tablespaceapp01.DBF' SIZE AUTOEXTEND ON MAXSIZE UNLIMITED; 

 8. Añadimos en el fichero tnsnames.ora la nueva bd:

PDB01 = 
(DESCRIPTION = 
 (ADDRESS_LIST = 
 (ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521)) 
 )
 (CONNECT_DATA = 
 (SERVICE_NAME = PDB01)
 )
 )






Oracle Wars © 2008. Template by Dicas Blogger.

TOPO