Archive for diciembre, 2007

Que permisos de Oracle son necesarios para GeneXus?

miércoles, diciembre 26th, 2007

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

Como desinstalar oracle 9

lunes, diciembre 17th, 2007

Como desinstalar oracle completamente, borrando entradas en el registro de windows.

Luego de probar la versión 10g de oracle me decidí a desinstalar Oracle 9.2 de mi máquina, y me encontré con algunos detalles, que no pude apagar definitivamente, como carpetas de oracle y entradas de oracle en los servicios de windows.
Intenté instalar el oracle 10 por arriba pero me encontré con otros problemas a la hora de ejecutar.
En fin, terminé creando una guia que comparto aqui con un paso a paso para desinstalar oracle 9 por completo.

Paso a paso

– Verificar si se tiene odbcs asociados y eliminarlos ya que después quedan corruptos y da otro dolor de cabeza desinstalarlos (aunque también podemos después crear uno nuevo con el mismo nombre y ahí podemos apagarlo, pero lo más prolijo sería eliminar el odbc asociado antes de desinstalar oracle)
– Ejecutar el universal installer
– Borrar todos los homes que aparezcan
– Borrar la variable de ambiente ORAHOME
– Borrar de la variable de ambiente PATH todas las referencias a oracle (panel de control / sistema / avanzado / variables de ambiente)
– Borrar del registro toda referencia a oracle (ejecutar regedit buscar carpeta oracle y borrar)
– Reiniciar el pc
– Borrar la carpeta oracle debajo de c:\

En mi caso en particular como tenia la base de datos instalada local el instalador/desinstalador no me borró los servicios OracleHome92TnsListener y OracleServiceMiMaquina.

Tenemos dos formas de borrar estos servicios de windows

1) sc delete OracleHome92TnsListener

Entramos en el panel de control / servicios y ya no está mas.

2) Ejecutando regedit
Borramos la cadena correspondiente a OracleServiceMiMaquina en:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services

Esta segunda opción lo que tiene de diferente es que para ver si el servicio desapareció del panel de control / servicios, hay que reiniciar el pc

Si se usa la primera opción no es necesario reiniciar el pc.

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