Que permisos de Oracle son necesarios para GeneXus?

Desde que trabajo con GeneXus, en la mayoría de las empresas que estuve, he visto dar el rol de DBA al usuario que fuera a conectarse a la base de datos.

También he visto excepciones, que comentaré más adelante, pero generalmente, el mismo usuario que usamos para crear las tablas, es el usuario que también ejecuta la aplicación.

Esta es la forma más simple, rápida y con menos mantenimiento para trabajar, pero no la más correcta.

El problema es que hace muchos años, no existían tantos DBAs ORACLE. Entonces el choque de fuerzas entre los implantadores de sistemas GeneXus y los DBAs no era tan habitual, en muchas empresas no existían DBAs y simplemente el usuario que usábamos en GeneXus era el todo poderoso DBA.

Con el paso del tiempo la cosa se fue complicando, porque el usuario de ORACLE DBA tiene permisos más allá de los necesarios y podía acceder a otros esquemas del banco de datos, cuando generalmente era una instancia de base para todos los sistemas de la empresa, que corrían bajo esquemas distintos. Esto entre otras atribuciones peligrosas que tiene el usuario ORACLE DBA, dejaba a los DBAs humanos de pelos de punta.

Hasta la versión 9i de ORACLE, asociando los roles de CONNECT y RESOURCE, y dándole permisos ilimitados para TABLESPACE al usuario ya era suficiente, y digamos estábamos mejor que dar el ROL de DBA a nuestro usuario.

El problema es que a partir de la versión 10g de ORACLE, fueron sacados algunos privilegios del ROL CONNECT.
Estos fueron:
CREATE SYNONYM
CREATE VIEW.

Sumado a esto en la versión 9i de ORACLE, se repetían los siguientes privilegios entre CONNECT y RESOURCE.
Estos eran:
CREATE CLUSTER
CREATE SEQUENCE
CREATE TABLE

Como conclusión, si hoy usamos ORACLE 10g tenemos que estar tomando un privilegio de aquí, otro de allá, para crear nuestro usuario ORACLE, para poder ejecutar con GENEXUS, entonces la vida se hace un poco más complicada.

Para esto, la solución es crearnos nuestro propio script de ROL Y PROFILE y asignarle a nuestro usuarios este ROL y PROFILE.

A continuación anexo los scripts de las atribuciones mínimas necesarias para crear, reorganizar tablas, usar el sistema con nuestro usuario GENEXUS. Existen algunos privilegios comentados con (*) que indican que son opcionales, están colocados allí porque si debemos pedirle a un DBA oficial que nos cree un usuario, es bueno pedirle estos privilegios para cuando necesitamos conectarnos con sqlplus para ver algunos datos de tablas, crear alguna view para ser usada con DataViews desde GeneXus, etc.

Crear un rol

CREATE ROLE NUESTROROL NOT IDENTIFIED;

— Privilegios tomados del Rol CONNECT
GRANT CREATE SESSION TO NUESTROROL;
GRANT ALTER SESSION TO NUESTROROL; — (*)
GRANT CREATE DATABASE LINK TO NUESTROROL; — (*)

— Privilegios tomados del Rol RESOURCE
GRANT CREATE SEQUENCE TO NUESTROROL;
GRANT CREATE TRIGGER TO NUESTROROL; — (*)
GRANT CREATE PROCEDURE TO NUESTROROL; — (*)
GRANT CREATE TABLE TO NUESTROROL;

— Otros Privilegios
— (en versiones anteriores a ORACLE 10 estos privilegios estaban en CONNECT)
GRANT CREATE VIEW TO NUESTROROL; — (*)
GRANT CREATE SYNONYM TO NUESTROROL; — (*)

— Privilegios de sistema
— (permite ver views de diccionario)
GRANT SELECT ANY DICTIONARY TO NUESTROROL; — (*)

Crear un perfil

CREATE PROFILE NUESTROPERFIL LIMIT
IDLE_TIME 120
— (para no dejar que nuestros usuarios dejen el sistema abierto sin usarlo por más de 2 horas)
SESSIONS_PER_USER 50;
— (para no permitir más de 50 sesiones en simultáneo)

Este perfil con estos valores es opcional, en caso de no necesitar controlar nada de esto, podemos usar el perfil DEFAULT de ORACLE, o por el contrario si precisamos diferenciar procesador y o memoria entre otros recursos de ORACLE para una sesión, se puede entrar mas en detalles a la hora de crear un PROFILE.

Por default la instancia de base de datos no está habilitada para restringir recursos del perfil.
Para que nuestro perfil funcione debemos pedirle al DBA que nos habilite este parámetro, o si tenemos nosotros permisos de system podemos hacer esta modificación con el siguiente comando:

ALTER SYSTEM SET RESOURCE_LIMIT=TRUE;

Luego debemos bajar y subir nuevamente la base de datos para que comenzar con este parámetro activo.

Ahora si, finalmente creamos el usuario:

Crear un usuario

CREATE USER NUESTROUSUARIO
IDENTIFIED BY NUESTROPASSWORD
DEFAULT TABLESPACE USERS
— (es recomendable tener nuestro tablespace definido)
TEMPORARY TABLESPACE TEMP
— (es recomendable tener nuestro tablespace definido)
PROFILE NUESTROPERFIL
ACCOUNT UNLOCK;
GRANT UNLIMITED TABLESPACE TO NUESTROUSUARIO;
GRANT NUESTROROL TO NUESTROUSUARIO;

Cabe aclarar un pequeño pero no menos importante detalle, referente al privilegio UNLIMITED TABLESPACE, tanto en versiones anteriores, como en la versión de ORACLE 10g, cuando asignamos el ROL RESOURCE, ORACLE también asigna este privilegio al usuario, cosa que no sucede cuando creamos nuestro propio ROL.
Si quisiéramos intentar asignar este privilegio a nuestro rol, nos daria el siguiente error:

ORA-01931
Cannot grant string to a role.
Cause: UNLIMITED TABLESPACE,\nREFERENCES, INDEX, SYSDBA or SYSOPER privilege cannot be granted to a\nrole.

Por tal motivo el GRANT debemos hacerlo a la hora de crear el usuario, como muestra el script anterior.

Espero que este resumen le haya sido útil.

Fabricio De los Santos
Gerencia de Proyectos – Consultoría GeneXus –
ERP – Sistemas de Misión Crítica – Bases de Datos.

Vea mis blogs en:
www.fabriciodelossantos.com

Deja un comentario