Manual de Bienvenida a la Forja Versión: 1.0.0 Este documento pretende familiarizar al lector con todos los servicios que ofrece la forja de gvhidra de la Dirección General de Tecnologías de la Información (en adelante DGTI) de la Generalitat Valenciana. Si estás leyendo este documento es porque debes haber recibido (o recibirás en breve) las credenciales de acceso a dicha forja. En primer lugar, aclararemos que es la forja, los proyectos que alberga y la accesibilidad de los mismos. La forja es un conjunto de servicios que se ofrecen para facilitar el desarrollo colaborativo de los proyectos gvhidra. Con estos servicios se pretende ayudar a los diferentes equipos de desarrollo y fomentar la colaboración entre los mismos. La forja está destinada para albergar proyectos desarrollados con el framework gvhidra en el ámbito de la DGTI, el propio framework y sus proyectos auxiliares. En relación a los servicios, la forja ubicada en la máquina http://gvhidra.gva.es está abierta a internet y ofrece: Gestión de identidad unificado: mediante LDAP Gestor de tickets: mediante Redmine Control de versiones: mediante SVN Foro/Wiki Gestor de documentos Gestor de Archivos y/o Documentos Gestor de Noticias Calendario Gantt Planificación de versión Lista de correo de gvhidra Formación: Cursos, talleres,... Es importante destacar el que todos los proyectos son por definición de acceso privado excepto el framework (proyecto gvhidra), el generador (proyecto Genaro) y la aplicación de prueba (proyecto Demo). Esto significa que sólo los usuarios autorizados y con permisos en el proyecto podrán acceder a la información, código, ficheros,... De forma opcional, la DGTI ofrece un entorno de desarrollo de aplicaciones gvhidra que puede ser utilizado para desarrollar aplicaciones dentro de dicho ámbito. Este entorno se encuentra ubicado en la máquina http://gvhidra test.gva.es y sólo está disponible en el anillo de la Generalitat Valenciana y a 1
aquellas IPs que lo soliciten. Ofrece los siguientes servicios: Servidor Web: Apache PHP Puerto 80 PHP 5.2.17 Puerto 83 PHP 5.3.17 Puerto 84 PHP 5.4.7 Proximamente Puerto 85 PHP 5.5 SGBD Puerto 5432 Postgres Puerto 1521 Oracle Puerto 3306 MySQL SSH Posteriormente, daremos las instrucciones de uso para conectar con este entorno de desarrollo. 2
Alta de nuevo proyecto en gvhidra Para solicitar un nuevo proyecto, el responsable del mismo se debe poner en contacto con el responsable de aplicaciones gvhidra de la DGTI, Juan Carlos Hernandez Comes (hernandez_juacom@gva.es). Tal y como se ha explicado en el apartado anterior, se creará la infraestructura básica para albergar el proyecto en la forja. En esta petición se debe detallar: Nombre del proyecto Miembros (identificando su rol entre Jefe de Proyecto, Desarrollador, Informador). Si requiere entorno de desarrollo Usuarios que tengan acceso al código. Ips en el anillo de la GVA SGBD si se conoce. Una vez tramitada la petición se creará la infraestructura y se informará al Jefe del proyecto vía email. Éste podrá validarse en la forja (http://gvhidra.gva.es) y deberá completar la configuración del proyecto a través de la pestaña Configuración. Información Permite gestionar la información general del proyecto como la descripción, las versiones del framework, el sistema de autentificación o el de autorización. En esta pestaña cabe destacar: Descripción: es un campo típico donde ubicar la finalidad del proyecto. Es importante tener cumplimentado este campo para, de forma rápida, poder conocer el propósito de la aplicación. Público: este check viene desmarcado por defecto ya que haría que este proyecto pudiera verse por cualquier usuario de internet. Es poco recomendable activarlo. Versiones de gvhidra, Jasper, Autentificación y Autorización. Esta información es muy importante para, conocer los sistemas con los que se integra la aplicación. Módulos Permite activar/desactivar módulos para este proyecto. Esto permite añadir o quitar funcionalidades como noticias, Gantt, gestión de peticiones,... 3
Miembros En este apartado aparecen los miembros que tienen acceso al proyecto. Esta información tiene como fuente el LDAP centralizado que unifica los accesos a la plataforma. Lo que podemos hacer en este apartado es asignar o quitar roles a un miembro. Estos roles son: Jefe de Proyecto: este rol permite acceder a la pestaña de Configuración del proyecto en el Redmine. Desarrollador: este rol da acceso lectura/escritura al código (mediante el SVN). Informador: permite acceder al proyecto, pero sin acceso al código. Si el acceso Web al repositorio mediante redmine está habilitado podrá navegar en modo lectura. IMPORTANTE: añadir o borrar miembros debe comunicarse abriendo una incidencia en el proyecto Soporte de la forja. Versiones Esta solapa permite gestionar las diferentes versiones de la aplicación. Una buena estratégia de versiones nos permite gestionar de forma más eficiente el proyecto para planificar qué cambios entra en una versión concreta. Categorías de las peticiones Permite añadir nuevos tipos de peticiones para el proyecto. Poco utilizado Wiki Permite configurar una Wiki para el proyecto. Repositorio Permite configurar un acceso web avanzado sobre el repositorio del control de versiones. Decimos que es avanzado porque permite realizar comparaciones entre diferentes versiones de un fichero, visualizar la fecha del último cambio en una rama, Para configurar dicho acceso se debe indicar la ubicación del control de versiones. Para configurar el repositorio de gvhidra debemos indicar: SCM: SVN URL: http://gvhidra.gva.es/svn/proyecto Identificador: identificador de un usuario con acceso al código. Contraseña: password de un usuario con acceso al código. Nota: las credenciales son las credenciales de la forja. Nota2: pulsar varias veces el botón Guardar para garantizar que se almacena la información Foros Permite configurar un foro para el proyecto. Una vez configurado, ya podemos hacer uso del proyecto. Cabe destacar que la mayor parte de los servicios se ofrecen desde Redmine. Sin hacer uso de él podemos utilizar: Control de versiones: para configurar el control de versiones tenemos que indicar la como ruta del repositorio http://gvhidra.gva.es/svn/proyecto. Sólo accederán a él los usuarios con Rol desarrollador en el proyecto. 4
Portal de gvhidra (www.gvhidra.org): En esta página podemos encontrar información general del framework así como documentos relativos a cursos, talleres, ejemplos que pueden ser útiles a los desarrolladores. Lista de correo: esta lista es de gran utilidad para los desarrolladores de aplicaciones con el framework. Se puede acceder a ella en modo consulta a través de Nabble http://gvhidra.3754916.n2.nabble.com/. En caso de querer participar en la comunidad es necesario suscribirse http://listserv.gva.es/cgi bin/mailman/listinfo/gvhidra_soporte. 5
Acceso al entorno de desarrollo en gvhidra test.gva.es Como hemos explicado anteriormente, para el desarrollo de los nuevos proyectos, opcionalmente, la DGTI proporciona un entorno de desarrollo en la máquina gvhidra test.gva.es. El uso de este entorno es opcional pudiéndose montar otro entorno en otra infraestructura (caso de, por ejemplo la CITMA). Para poder acceder a él se debe solicitar a través de una petición en el proyecto Soporte indicando información acerca de las personas que se van a conectar: Usuario de la forja Ip dentro del anillo de la Generalitat Valenciana. Una vez realizados los trámites, se debe tener acceso desde la máquina cliente al servidor gvhidra test.gva.es. Instalación de herramientas en la máquina de desarrollo de cada miembro del proyecto Los desarrolladores del proyecto deberán tener instaladas varias herramientas necesarias para el desarrollo con gvhidra. Básicamente son: Un IDE de desarrollo: recomendamos Eclipse, aunque también se pueden utilizar otros. Si procede, Plugin de PHP para el IDE seleccionado. Si procede, Plugin de SVN para el IDE seleccionado. Un IDE interactuar con la Base de Datos: recomendamos TOAD, pgadminiii, SQLDeveloper o SQuirrel (dependiendo de la Base de Datos y las preferencias). Si la aplicación requiere informes, instalar ireports en la versión recomendada por el proyecto jasper (actualmente 4.5.1) A continuación se muestra el diagrama BPMN con las tareas a realizar por cada desarrollador para conseguir un entorno de trabajo adecuado: La instalación de estas herramientas sale del ámbito de este documento ya que se trata de una simple recomendación. Una vez instaladas, éstas o sus equivalentes, pasaremos a la configuración. Configuración de la conexión máquina de desarrollo al servidor Una vez instaladas las herramientas, tendremos que acceder a la máquina de desarrollo. Para trabajar con 6
ella, recomendamos realizar una conexión vía sshfs que permita montar de forma segura una carpeta remota. En el siguiente diagrama mostramos los pasos a realizar para realizar dicha conexión: Las tareas concretas a realizar son las siguientes: La maquina (servidor) que va a utilizarse es gvhidra test.gva.es. Cada programador que quiera usarla como máquina de desarrollo, tendrá que tener cuenta en la misma y acceso desde la IP desde la que trabaje, por convenio, se ha decidido que el usuario sea el prefijo de la cuenta de correo (en el ejemplo, pascual_dav). Lo siguiente es conseguir conectarse por ssh a la máquina gvhidra test.gva.es sin necesidad de introducir el password. Para ello, supongamos que la máquina (PC) desde la que vamos a conectar (dpascual.coput.gva.es) tiene un usuario dpascual. Podemos encontrarnos con dos situaciones: 1 1. El usuario dpascual NO tiene generados un par de claves (pública y privada) una clave RSA : a. Generar las claves privada y pública para permitir el montaje de la carpeta del servidor a través de un protocolo cifrado y sin uso de contraseñas. b. Si queremos generar una clave nueva diferente de las que ya tenemos, deberemos borrar antes los ficheros de las claves públicas y privadas, y ejecutar el comando para eliminar la entrada del servidor remoto que teníamos en el fichero known_hosts: pc$ ssh keygen R gvhidra test.gva.es c. Ejecutar UNA SOLA VEZ los siguientes comandos en el cliente para generar las claves 2 pública y privada del usuario. Cuando pregunte por el passphrase, poner un texto vacío. Para generar los ficheros: pc$ cd $HOME/.ssh pc$ ssh keygen t rsa 2. El usuario dpascual YA tiene generados un par de claves (pública y privada) una clave RS, bien porque viene del punto anterior, o porque ya se hizo en otra ocasión: a. Llevamos los ficheros a la máquina (servidor) al que queremos conectarnos sin password. pc$ scp /home/dpascual/.ssh/id_rsa.pub pascual_dav@gvhidra test.gva.es:~/ b. Nos conectamos a gvhidra test.gva.es y completamos el proceso pc$ ssh pascual_dav@gvhidra test.gva.es password: [La conexión se realiza, es decir, ya estamos en gvhidra test.gva.es] test$ cd ~/ 1 Para comprobar si se ha hecho previamente, validar que en el directorio $HOME/.ssh del PC no tenemos ningún fichero con extensiçon.pub. 2 Cada vez que se ejecuta este comando, se generará una clave privada y otra pública (la segunda dependiente de la primera). Si varía alguna de ellas (tras una reinstalación) dejaría de funcionar en los servidores en los que se hubiera instalado la clave pública ya creada. 7
test$ mkdir.ssh test$ cd.ssh test$ cat >../id_rsa.pub >authorized_keys2 test$ cat../id_rsa.pub >> authorized_keys2 c. Comprobamos que los permisos sean los correctos test$ ls la rw r r 1 pascual_dav pascual_dav 240 2012 06 13 17:27 authorized_keys2 d. Borramos la clave pública del directorio superior y nos desconectamos del servidor test$ cd ~/ test$ rm id_rsa.pub test$ exit pc$ Tanto si hemos necesitado pasar por el punto 1, o si sólo hemos realizado el punto 2, ahora simplemente queda comprobar que la conexión sin password puede establecerse: pc$ ssh pascual_dav@gvhidra test.gva.es Linux gvhidra test 2.6.32 33 server #72 Ubuntu SMP Fri Jul 29 21:21:55 UTC 2011 x86_64 GNU/Linux Ubuntu 10.04.3 LTS Welcome to the Ubuntu Server! Si al ejecutar el ssh aparece este error: Agent admitted failure to sign using the key. Hay que ejecutar en la máquina local el comando ssh add que carga las claves en el agente ssh: pc$ ssh add Identity added: /home/usuario/.ssh/id_rsa (/home/usuario/.ssh/id_rsa) Lo siguiente es preparar el montaje en local del directorio correspondiente del usuario, para ello, nos conectamos a la máquina gvhidra test.gva.es con nuestro usuario y creamos en el directorio HOME del mismo la jerarquia de directorios: public_html/svnwrk. Dentro de dicho directorio irá ubicado el código fuente de la aplicación. La URL será: http://gvhidra test.gva.es/~pascual_dav/svnwrk/ Variando el usuario (en el ejemplo pascual_dav) por el equivalente de cada usuario. Para montar la unidad podemos partir del siguiente SCRIPT #Montaje de unidades de RED DESADIR=$HOME/mnt_gvHidraTest/ echo "Inicio de sesión > Montaje de unidades de red" #Comprobamos si YA esta montado el directorio if [ f $DESADIR/desarrollo ] then echo "Directorio public_html de Gardel ya montado " else echo "Montando directorio desarrollo..." if sshfs pascual_dav@gvhidra test.gva.es:/home/pascual_dav/public_html \ $DESADIR oreaddir_ino,workaround=rename,direct_io,uid=$uid,gid =$GROUPS,ServerAliveInterval=15 then echo "Montaje de unidad de desarrollo completad o" else echo "Problemas al montar el directorio!!" fi fi 8
Montaje de unidades de RED #!/bin/bash #Montaje de unidades de RED DESADIR=/home/pascual_dav/mnt_gvHidraTest/ echo "Inicio de sesión > Montaje de unidades de red" #Comprobamos si YA esta montado el directorio if [ f $DESADIR/desarrollo ] then echo "Directorio public_html de GvHidra test ya montado " else echo "Montando unidad de desarrollo..." if sshfs pascual_dav@gvhidra test.gva.es:/home/pascual_dav/public_html /$DESADIR oreaddir_ino o workaround=rename o direct_io o uid=$uid o gid=$groups o ServerAliveInterval=15 then echo "Montando el directorio del servidor en $HOME/mnt_gvHidraTest"; fi else fi echo "Problemas al montar el directorio del servidor en $HOME/mnt_gvHidraTest!!"; En el caso de que se produzca error al intentar montar la unidad, si al conectarse a gvhidra test tenemos lo siguiente: lcanoc@lcanoc:~/bin$ ssh cano_lor@gvhidra test.gva.es Linux gvhidra test 2.6.32 45 server #101 Ubuntu SMP Mon Dec 3 15:54:27 UTC 2012 x86_64 GNU/Linux Ubuntu 10.04.3 LTS Welcome to the Ubuntu Server! * Documentation: http://www.ubuntu.com/server/doc System information as of Fri Jan 18 10:58:07 CET 2013 System load: 0.18 Processes: 224 Usage of /: 10.6% of 124.02GB Users logged in: 1 Memory usage: 42% IP address for eth2: 192.168.222.76 Swap usage: 0% Graph this data and manage this system at https://landscape.canonical.com/ New release 'precise' available. Run 'do release upgrade' to upgrade to it. *** System restart required *** Last login: Fri Jan 18 10:26:58 2013 from 172.19.18.49 bash: warning: setlocale: LC_ALL: cannot change locale (es_es@euro) y al ejecutar el script del montaje de la unidad da el siguiente error: SSHFS version 2.2 remote host has disconnected Revisar el fichero /etc/environment en local y si están las siguientes líneas: LC_ALL=es_ES@euro LANG="es_ES.UTF 8" LANGUAJE="es_ES:es:en_GB:en" LC_TYPE=es_ES@euro Se procede a comentarlas. Se reinicia el sistema y ya se debería de montar la unidad de desarrollo sin problemas. Al conectarse, se podrá comprobar que el usuario pertenece a los grupos de las aplicaciones en las que participe: pascual_dav@gvhidra test:~# groups Si se produce algún problema puede solicitar ayuda a través de proyecto de Soporte. Gestión de la base de datos La base de datos es algo particular de cada aplicación. En todo caso, para facilitar el desarrollo de esquemas robustos y previstos de conceptos básicos de seguridad sugerimos una serie de plantillas que 9
facilitarán el trabajo del responsable del proyecto. Simplemente se tiene que rellenar las plantillas correspondientes al SGBD elegido para nuestra aplicación. 10
PostgreSQL Adaptar la plantilla siguiente y ejecutarla conectándose al sistema como el usuario postgres. /*Creación del esquema */ CREATE SCHEMA <esq>; COMMENT ON SCHEMA <esq> IS '<comentario entorno>'; /* Creación del usuario propietario */ /* Sustituir <usu> por el nombre de usuario */ CREATE USER <usu> PASSWORD '<pwusu>'; ALTER USER <usu> VALID UNTIL 'infinity'; /* Creación de los usuarios de aplicación (uno por perfil) */ /* Sustituir <pwusu_ae> por el password para el usuario de lectura/escritura _ae */ /* Sustituir <pwusu_ac> por el password para el usuario de sólo lectura _ac */ CREATE USER <usu>_ae PASSWORD '<pwusu_ae>'; CREATE USER <usu>_ac PASSWORD '<pwusu_ac>'; ALTER USER <usu>_ae VALID UNTIL 'infinity'; ALTER USER <usu>_ac VALID UNTIL 'infinity'; /* Creación de los roles */ CREATE ROLE r<usu> ADMIN <usu>; CREATE ROLE r<usu>_c ADMIN <usu>; /* Asignar los roles a los usuarios */ GRANT r<usu> TO <usu>; GRANT r<usu> TO <usu>_ae; GRANT r<usu>_c TO <usu>_ac; /* Dar permisos al esquema para el usuario propietario y los roles */ GRANT ALL ON SCHEMA <esq> TO <usu> WITH GRANT OPTION; GRANT USAGE ON SCHEMA <esq> TO r<usu>; GRANT USAGE ON SCHEMA <esq> TO r<usu>_c; /* Si necesitan acceder a elementos de otros esquemas, se crea un rol intermedio, que el propietario administrará dando visibilidad y permisos a los objetos que desee */ /* Realizado por el administrador */ CREATE ROLE r<esq>_<otroesq1> ADMIN <usu>; ALTER ROLE <otrousu> SET search_path=<otroesq1>, <esq>; /* Realizado por el propietario del esquema */ GRANT USAGE ON SCHEMA <esq> TO <otrousu>; GRANT r<esq>_<otroesq1> TO <otrousu>; GRANT privilegio ON TABLE <esq>.<objeto> TO r<esq>_<otroesq1>; /* Asignar los search_path necesarios para los usuarios */ ALTER USER <usu> SET search_path = '<esq>','<otroesq1>','<otroesq2>'; ALTER USER <usu>_ae SET search_path = '<esq>','<otroesq1>','<otroesq2>'; ALTER USER <usu>_ac SET search_path = '<esq>','<otroesq1>','<otroesq2>'; /* Opcional: Creación de infraestructura de LOG */ CREATE TABLE <esq>.tcmn_errlog ( iderror numeric(9,0) NOT NULL, 11
aplicacion character varying(30) NOT NULL, modulo character varying(10), version character varying(10) NOT NULL, usuario character varying(30) NOT NULL, fecha timestamp without time zone NOT NULL, tipo numeric(2,0) NOT NULL, mensaje text NOT NULL ); ALTER TABLE <esq>.tcmn_errlog OWNER TO <esq>; GRANT ALL ON TABLE <esq>.tcmn_errlog TO r<esq>; CREATE SEQUENCE <esq>.scmn_id_errlog START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; ALTER TABLE <esq>.scmn_id_errlog OWNER TO <esq>; GRANT ALL ON SEQUENCE <esq>.scmn_id_errlog TO r<esq>; 12
Para Oracle 3 Adaptar la plantilla siguiente y ejecutarla conectándose al sistema como el usuario system Creación tablespace para aplicación, autogestionado pero limitado CREATE TABLESPACE <esq>_tbl DATAFILE '/<path_datos_aplicaciones>/<esq>_tbl.dbf' SIZE 50M AUTOEXTEND ON NEXT 10M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL AUTOALLOCATE; Creación tablespace para índices de aplicación, autogestionado pero limitado CREATE TABLESPACE <esq>_idx DATAFILE '/<path_datos_aplicaciones>/<esq>_idx.dbf' SIZE 50M AUTOEXTEND ON NEXT 10M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL AUTOALLOCATE; Creación usuario propietario CREATE USER <esq> IDENTIFIED BY <pwusu> DEFAULT TABLESPACE <esq>_tbl TEMPORARY TABLESPACE TEMP ACCOUNT UNLOCK; ALTER USER <esq> DEFAULT ROLE ALL; GRANT CREATE SESSION TO <esq>; Permisos mínimos para el propietario de los objetos(opción: Agrupar en un ROL de propietario) GRANT CREATE ANY SYNONYM TO <esq>; Pendiente de solución más segura GRANT SELECT_CATALOG_ROLE TO <esq>; / GRANT CREATE TABLE TO <esq>; GRANT CREATE TRIGGER TO <esq>; GRANT CREATE VIEW TO <esq>; GRANT CREATE MATERIALIZED VIEW TO <esq>; GRANT CREATE SEQUENCE TO <esq>; GRANT CREATE ROLE TO <esq>; Para creación de roles entre aplicaciones Quotas sobre tablespaces ilimitadas puesto que el tablespace está limitado ALTER USER <esq> QUOTA UNLIMITED ON <esq>_tbl; ALTER USER <esq> QUOTA UNLIMITED ON <esq>_idx; Creación usuario de aplicación escritura CREATE USER <esq>_ae IDENTIFIED BY <pwusu>_ae DEFAULT TABLESPACE <esq>_tbl TEMPORARY TABLESPACE TEMP ACCOUNT UNLOCK; ALTER USER <esq>_ae DEFAULT ROLE ALL; GRANT CREATE SESSION TO <esq>_ae; Creación usuario de aplicación lectura CREATE USER <esq>_ac IDENTIFIED BY <pwusu>_ac DEFAULT TABLESPACE <esq>_tbl 3 En el ejemplo que estamos siguiendo <path_datos_aplicaciones>=/u01/app/oracle/oradata/xe/apps y <esq>=sedes 13
TEMPORARY TABLESPACE TEMP ACCOUNT UNLOCK; ALTER USER <esq>_ac DEFAULT ROLE ALL; GRANT CREATE SESSION TO <esq>_ac; Creación de roles para esquema (Un rol con permisos de CRUD y otro solo lectura) CREATE ROLE r<esq>; CREATE ROLE r<esq>_c; Asignación de rol con opción de administrar al propietario, para que pueda aplicarlo a roles (roles sobre roles para integración de aplicaciones) GRANT r<esq> TO <esq> WITH ADMIN OPTION; GRANT r<esq>_c TO <esq> WITH ADMIN OPTION; Esta asignación la puede hacer el propietario, pero se hace ya. GRANT r<esq> TO <esq>_ae; GRANT r<esq>_c TO <esq>_ac; Si necesitan acceder a elementos de otros esquemas, asignar permisos para que el propietario y los usuarios de la aplicación puedan ver los mismos GRANT <otroesq_1>, <otroesq_2> TO <esq>_ae; GRANT <otroesq_1>_c, <otroesq_2>_c TO <esq>_ac; AQUÍ VIENE EL DDL DE CREACIÓN DE OBJETOS YA CONECTADO COMO USUARIO PROPIETARIO Asignación de permisos sobre objetos para el rol r<esq> (A ejecutar el resultado de la consulta por el propietario) SELECT 'GRANT DELETE, INSERT, SELECT, UPDATE ON <esq>.' TABLE_NAME ' TO r<esq>;' FROM ALL_TABLES WHERE OWNER=upper('<esq>'); Asignación de permisos sobre objetos para el rol r<esq>_c (A ejecutar el resultado de la consulta por el propietario) SELECT 'GRANT SELECT ON <esq>.' TABLE_NAME ' TO r<esq>_c;' FROM ALL_TABLES WHERE OWNER=upper('<esq>'); Creación de sinónimos privados para visibilidad por usuarios no propietarios (A ejecutar el resultado de la consulta por el propietario) SELECT 'CREATE SYNONYM <esq>_ae.' TABLE_NAME ' FOR <esq>.' TABLE_NAME ';' FROM ALL_TABLES WHERE OWNER=upper('<esq>'); SELECT 'CREATE SYNONYM <esq>_ac.' TABLE_NAME ' FOR <esq>.' TABLE_NAME ';' FROM ALL_TABLES WHERE OWNER=upper('<esq>'); 14
Opcional: Creación de infraestructura de LOG CREATE TABLE <esq>.tcmn_errlog ( iderror integer NOT NULL, aplicacion varchar2(30) NOT NULL, modulo varchar2(10) default NULL, version varchar2(10) NOT NULL, usuario varchar2(30) not null, fecha timestamp default SYSDATE, tipo varchar(10) NOT NULL, mensaje CLOB NOT NULL ); ALTER TABLE <esq>.tcmn_errlog add constraint pk_<esq>_error primary key(iderror); CREATE SEQUENCE <esq>.scmn_id_errlog minvalue 1 start with 1 increment by 1 cache 20; CREATE SYNONYM <esq>_ae.scmn_id_errlog FOR <esq>.scmn_id_errlog; CREATE SYNONYM <esq>_ae.tcmn_errlog FOR <esq>.tcmn_errlog; GRANT ALL ON <esq>.tcmn_errlog to r<esq>; GRANT ALL ON <esq>.scmn_id_errlog to r<esq>; 15