miércoles, 19 de abril de 2023

SQL Developer 23.1 ya está disponible!

La última versión de Oracle SQL Developer (23.1) fue liberada hace unas horas por Oracle. SQL Developer es una IDE gratuita que permite administrar y utilizar bases de datos Oracle tanto On Premise como en la nube.


Esta versión, así como la herramienta SQLcl (sobre la cual hablamos hace unos pocos días en el artículo "SQLcl 23.1 ya está disponible!") , pueden ser descargados desde la página de descargas de SQL Developer, la cual también incluye una sección con información sobre como realizar la instalación.

Algunos links útiles:
  • Release Notes de SQL Developer 23.1.
  • Documentación de SQL Developer (al momento de escribir el articulo no estaba actualizada a la versión 23.1).

Para consultas y dudas, recomendamos usar el foro de SQL Developer en Oracle Community.

Como es habitual, la versión 23.1 de SQL Developer Data Modeler fue también liberada y esta disponible para ser descargada aquí. Las Release Notes nos permiten conocer mas detalles sobre esta nueva versión, y pronto estará actualizada la documentación.

¿Qué hay de nuevo en SQL Developer 23.1?

Si bien esta versión incluye principalmente corrección de errores, hay algunas nuevas características mencionar.

Corrección de errores de Code Insight/Completion

Había inconsistencias con el operador AND que ahora deberían estar funcionando como se esperaba.

Problemas de tiempo de respuesta del sistema de archivos de Windows

Había un error en Java que afecta severamente el tiempo de respuesta en SQL Developer al usar el sistema operativo para varias tareas en Windows. La solución ha sido incluida en la distribución de Windows x64 de 23.1 donde incluimos el JDK actualizado.

Actualización para Oracle Database 23c

Se actualizo el parser para aceptar las nuevas sintaxis de Oracle Database 23c, como podemos ver a continuación:



Pueden consultar todos los artículos relacionados a Oracle Database 23c agrupados en en el tag Database 23c.


Oracle 23c - IF [NOT] EXISTS en Sentencias DDL


En este artículo vamos a analizar otra nueva característica de Oracle Database 23c que permite generar scripts de creación o eliminación de objetos más robustos y sencillos.

El Problema

En más de una ocasión nos encontramos en la situación de tener que ejecutar un script de creación de objetos y no estar seguros si el mismo ya fue ejecutado previamente en la base de datos. De ser así, es probable que todas o muchas de las sentencias CREATE del mismo den un error (al ya existir el objeto que se desea crear). Similar escenario se da en el caso opuesto, cuando tenemos un script para eliminar objetos pero alguno de ellos ya fue eliminado o directamente nunca fue creado.

Por ejemplo, veamos qué ocurriría si queremos volver a probar el script que usamos en el artículo "Oracle 23c - Privilegios de Esquema" para crear usuarios en la nuestra base de datos:

CREATE USER Ventas IDENTIFIED BY Ventas23c QUOTA UNLIMITED ON users;
Automáticamente veremos el siguiente error:


IF [NOT] EXIST en sentencias de tipo DDL

Esta cláusula evita que las sentencias de creación, actualización o eliminación de objetos den error en caso que los mismos ya existan (creación) o no existan (actualización o eliminación), como podemos ver a continuación:

CREATE USER IF NOT EXISTS Ventas IDENTIFIED BY Ventas23c QUOTA UNLIMITED ON users;

Utilizando SQL Developer para ejecutar esta sentencia, el mensaje que recibimos es que el usuario IF ha sido creado (lo cual no es así) pero lo importante es que la sentencia no genera un error:

User IF creado.

La decisión de mostrar que el objeto ha sido creado es para mantener el mismo comportamiento cuando el objeto no existe y es creado que cuando ya existe, en el caso que se utilice pruebas de regresión para analizar el resultado del script.


Eliminando Objetos Inexistentes

Así como evitamos error al intentar crear un objeto existente con IF NOT EXISTS, lo mismo podemos probar si queremos eliminar objetos que no existen, usando la cláusula sin la palabra clave IF EXISTS, como vemos a continuación:

DROP TABLE Ventas.NoExiste;
DROP TABLE IF EXISTS Ventas.NoExiste;

Al ejecutar ambas sentencias, vemos que la primera genera un error ya que la tabla no existe, mientras que la segunda no genera el error:


Nuevamente, hasta que no se actualice SQL Developer, el mensaje muestra "IF" como nombre de objeto involucrado cuando debería ser el nombre real del mismo el que se muestre.


Conclusión

Oracle Database 23c ofrece la clausula IF [NOT] EXISTS en sentencias DDL para preparar scripts de creación de objetos que evita errores y hace más simples los mismos.


Si desean conocer más sobre Oracle 23c, es recomendable que vean estos artículos en este blog como punto de partida:

Adicionalmente, pueden consultar todos los artículos relacionados a Oracle Database 23c agrupados en en el tag Database 23c.


martes, 18 de abril de 2023

Oracle APEX 23.1 (versión de pre-producción) disponible en apex.oracle.com



Oracle liberó en el día de ayer la versión de pre-producción de Oracle APEX 23.1 en el sitio apex.oracle.com, el cual permite evaluar en forma gratuita las funcionalidades de Oracle APEX antes que las mismas estén disponibles en Oracle Cloud o para ser descargado e instalado on-premise.


Esta nueva versión incorpora interesantes cambios, como ser:

  • Componentes de plantilla.
  • Notificaciones automáticas de PWA.
  • Mejoras en la administración de APEX.
  • Navegador de objetos modernizado.
  • Mejoras en la fuente de datos REST.
  • Nuevo selector de color.
  • Nueva opción para ejecutar la página procesos en segundo plano.
  • Integración con SQL Developer Web.
  • Mejoras en la experiencia del desarrollador.

Próximamente publicaremos mas detalles sobre todas estas nuevas funcionalidades y mejoras en APEX 23.1.


Oracle 23c - Privilegios de Esquema

Otra nueva característica que nos trae Oracle Database 23c es la posibilidad de otorgar permisos en forma sencilla sobre todos los objetos de un esquema, sin necesidad de identificarlos individualmente ni de agregar nuevos permisos al agregar nuevos objetos.

Escenario

Tenemos una aplicación con 600 tablas distribuidas en los esquemas Ventas y RRHH. Para poder analizar las ventas, desarrollamos un conjunto de reportes que se acceden con un nuevo usuario VentasR que debe tener acceso a las tablas del esquema Ventas pero solo para lectura.

Hasta Oracle 23c, para poder hacer esto teníamos dos opciones:

  • Otorgar el privilegio READ o SELECT al usuario VentasR de cada una de las tablas del esquema Ventas en forma individual. Si en el esquema Ventas se agregan nuevas tablas, es necesario que otorgar el privilegio de READ o SELECT a cada nueva tabla.
  • Otorgar el privilegio de sistema SELECT ANY TABLE al usuario VentasR, con lo cual no es necesario darle privilegios individuales al agregar nuevas tablas a Ventas, pero el usuario podrá ver también información de las tablas del esquema RRHH.

Como vemos, una solución es la correcta desde el punto de vista de requerimiento (otorgar permisos individuales) aunque es costosa de implementar y mantener, y la otra es sencilla desde el punto de vista de su otorgamiento y no requiere más interacción si se agregan tablas, pero introduce un riesgo de seguridad al permitir el acceso a TODAS las tablas de la base de datos en vez de sólo las del esquema Ventas.


Otorgar Privilegios de Esquema

Oracle Database 23c incluye un nuevo tipo de privilegio adicional al de sistema o de objeto, que es el privilegio de esquema. Con el, podemos otorgar un privilegio a todos los objetos existentes en un esquema, sin necesidad de identificar los mismos en forma individual. Para nuestro caso, la sintaxis sería la siguiente:

GRANT SELECT ANY TABLE ON SCHEMA Ventas TO VentasR;

Veamos ahora cómo funciona este privilegio, probando con un ejemplo en Oracle 23c. Primero, vamos a crear dos esquemas (Ventas y RRHH) con un par de tablas cada uno, y un esquema VentasR que deberá acceder a los datos de Ventas (hacemos estos directamente con el usuario SYSTEM para ahorrar tiempo).

CREATE USER Ventas IDENTIFIED BY Ventas23c QUOTA UNLIMITED ON users; GRANT db_developer_role TO Ventas; CREATE TABLE Ventas.TablaV1 (ID NUMBER(10), Descripcion VARCHAR(100)); CREATE TABLE Ventas.TablaV2 (ID NUMBER(10), Descripcion VARCHAR(100)); INSERT INTO Ventas.TablaV1 VALUES (1, 'TablaV1 - 1'); INSERT INTO Ventas.TablaV1 VALUES (2, 'TablaV1 - 2'); INSERT INTO Ventas.TablaV2 VALUES (1, 'TablaV2 - 1'); INSERT INTO Ventas.TablaV2 VALUES (2, 'TablaV2 - 2'); -- CREATE USER RRHH IDENTIFIED BY RRHH23c QUOTA UNLIMITED ON users; GRANT db_developer_role TO RRHH; CREATE TABLE RRHH.TablaV1 (ID NUMBER(10), Descripcion VARCHAR(100)); CREATE TABLE RRHH.TablaV2 (ID NUMBER(10), Descripcion VARCHAR(100)); INSERT INTO RRHH.TablaV1 VALUES (1, 'TablaV1 - 1'); INSERT INTO RRHH.TablaV1 VALUES (2, 'TablaV1 - 2'); INSERT INTO RRHH.TablaV2 VALUES (1, 'TablaV2 - 1'); INSERT INTO RRHH.TablaV2 VALUES (2, 'TablaV2 - 2'); -- CREATE USER VentasR IDENTIFIED BY VentasR23c QUOTA UNLIMITED ON users; GRANT CONNECT TO VentasR;
A continuación, nos vamos a conectar con el usuario VentasR y ejecutar lo siguiente:

SELECT * FROM Ventas.TablaV1;
SELECT * FROM Ventas.TablaV2; SELECT * FROM RRHH.TablaV1;
Lo cual nos va a generar los siguientes errores, ya que el usuario VentasR no posee permisos de SELECT sobre ninguna de esas tablas:



Con el usuario SYSTEM le vamos a otorgar el privilegio de sistema "SELECT ANY TABLE" y vamos a volver a ejecutar las sentencias SELECT:

SELECT * FROM Ventas.TablaV1;
SELECT * FROM Ventas.TablaV2; SELECT * FROM RRHH.TablaV1;
Como vemos a continuación, podemos consultar las tablas del esquema Ventas, pero también las del esquema RRHH, lo cual es un problema de seguridad:


Volviendo al usuario SYSTEM, vamos a revocar el permiso SELECT ANY TABLE y vamos a otorgar el mismo nuevamente pero con la opción ON SCHEMA para indicarle que aplique solo a los objetos del esquema Ventas:

REVOKE SELECT ANY TABLE FROM VentasR; GRANT SELECT ANY TABLE ON SCHEMA Ventas TO VentasR;
El resultado es el siguiente:

Revoke correcto. Grant correcto.
Ahora si volvemos a ejecutar la consulta con el usuario VentasR, y vemos que podemos consultar las tablas de Ventas pero no las de RRHH:




Como último paso, vamos a crear una tercer tabla en el esquema Ventas:

CREATE TABLE Ventas.NuevaTabla (ID NUMBER(10), Descripcion VARCHAR(100)); INSERT INTO Ventas.NuevaTabla VALUES (1, 'Nueva');
Y podemos validar que la misma puede ser consultada automáticamente por el usuario VentasR sin necesidad de otorgar un permiso individual sobre la misma:


Consultando Privilegios de Esquema

La incorporación de esta nueva funcionalidad implica nuevas tablas del diccionario de datos donde se pueden consultar los privilegios de esquema que han sido otorgados:

  • DBA_SCHEMA_PRIVS
  • ROLE_SCHEMA_PRIVS
  • USER_SCHEMA_PRIVS
  • SESSION_SCHEMA_PRIVS
  • V$ENABLEDSCHEMAPRIVS

Aquí podemos ver un ejemplo de su uso, donde nos muestra el privilegio otorgado a VentasR:



Conclusión

Con esta nueva funcionalidad se hace mucho más fácil gestionar los permisos otorgados a nivel de objetos de usuario. Ya no es necesario actualizar los permisos otorgados de un usuario A a un usuario B ante cualquier objeto que se agregue al usuario A.

Si bien demostramos el mismo con el permiso de SELECT, puede usarse con cualquier privilegio como se detalla en la documentación.


Si desean conocer más sobre Oracle 23c, es recomendable que vean estos artículos en este blog como punto de partida:

Adicionalmente, pueden consultar todos los artículos relacionados a Oracle Database 23c agrupados en en el tag Database 23c.


lunes, 17 de abril de 2023

Gestión de Bases de Datos en Oracle Cloud

Oracle Cloud Infrastructure ofrece OCI Database Management, una herramienta que tiene características similares a Oracle Enterprise Manager utilizado para gestionar Bases de Datos en entornos on-premise. 


Habilitar Database Management

Esta funcionalidad no viene incluida por defecto, por lo que debemos habilitarla en cada base de datos que deseemos. Para ello tenemos que ir a la sección de "Administración" dentro de "Gestión de base de datos" en "Observación y Gestión":



Una vez en esa pantalla de Oracle Cloud Infrastructure, veremos todos los sistemas de Oracle Database (VMs o Bare Metal, Exadata o Autonomous Database) que ya están siendo gestionados por este servicio, y podemos agregar nuevos usando el botón "Activar gestión de base de datos":


El paso siguiente es seleccionar una base de datos Oracle (ya sea Autonomous Database, Exadata o un DB System en una VM o Bare Metal) existente. En el ejemplo siguiente, elegimos gestionar una base de datos autónoma (es mas sencilla de configurar que una DB en un DBSystem, ya sea VM o BM) llamada ADB19c, para lo cual tenemos que ir eligiendo las diversas opciones hasta encontrar la base de datos deseada:



Nota: En el caso de activar la funcionalidad para una DB externa o residente en una VM o BM, podemos elegir entre dos opciones de gestión:
  • OCI Database Management FULL: Disponible para las ediciones Enterprise y Standard de Oracle database, a un costo adicional. En el caso de ser una base de datos estándar no incluye opciones de Enterprise como ser AWR Explorer o Performance HUB.
  • OCI Database Management BASIC: Disponible para todas las ediciones de Oracle Database, sin costo adicional.


Una vez que activamos la gestión de base de datos, podemos ver en la misma que hay una nueva solicitud de trabajo (la cual tarda unos pocos minutos) para habilitar la gestión en la base de datos deseada:


Una vez completado el trabajo, en la página de "Bases de Datos Gestionadas" ya veremos a la nueva base de datos en la lista:


Si seleccionamos la opción de "Resumen de Flota" podremos ver un resumen de todas las bases de datos que están siendo gestionadas por esta funcionalidad:


Haciendo click en el nombre de una base de datos en particular, podemos ir a la página de gestión de la misma, donde tenemos en la parte superior información básica sobre la base de datos y la opción de abrir el Hub de Rendimiento o el Almacén SQL:


En la parte inferior tenemos diversos gráficos que nos muestran estadísticas de la última hora, día o semana de la base de datos:


Por ultimo, el Hub de Rendimiento nos muestra toda la información sobre la performance de nuestra base de datos, como podemos ver a continuación:



Costos

Los costos de la versión full son los siguientes:


Hice una simulación en Cloud Cost Estimator de cuanto saldria por mes usar la versión full para una base de datos autónoma, la cual podemos ver a continuación:


Conclusión

Considerando que esta opción Cloud brinda casi toda la funcionalidad disponible en Oracle Enterprise Manager a un costo realmente minino (menos de 20 dólares al mes para gestionar una instancia cuyo costo mensual ronda los 1000 dólares), Database Management es una alternativa a considerar para simplificar la administración de nuestras bases de datos en la nube.