Año 2 Volumen 1 - Mayo 2010 Realmente útil nueva característica de Oracle database 11.2 Contenido Por: Ing. Luis Fernando Alonzo [email protected] Página 1 Realmente útil Nueva Característica de Oracle 11.2 4 Alta disponibilidad para Oracle Internet Directory 7 Encriptación de datos ¿Ha considerado realizar una modificación al código de un paquete, procedimiento, función o trigger de base de datos en un ambiente de producción? Si lo ha considerado o realizado, estará al tanto de las implicaciones de este procedimiento aparentemente sencillo. Este procedimiento es considerado como parchar o agregar nueva funcionalidad al código ya creado en objetos dentro de la base de datos, o bien una actualización a la aplicación. Las obvias implicaciones en un ambiente de producción: invalidación de objetos dependientes, bloqueos al intentar compilar automáticamente estos objetos, y básicamente interrupción del servicio de base de datos. Oracle La característica introducida en Oracle Database 11g Release 2, Editionbased Redefinition permite realizar actualizaciones en línea a objetos de base de 12 Metadatum datos a través del manejo de versiones de los objetos; permite minimizar el tiempo 5a. Ave. 5-55 Zona14, Edificio Euro Plaza Torrenecesario II, Nivel 12 para actualizaciones de código fuera de servicio y, si se toma esta nueva Editores Generales característica para el diseño y desarrollo de nuevas aplicaciones, es posible Teléfono: (502)2364-5300 Fax: (502)2364-5311 eliminar el tiempo fuera de servicio necesario actualmente para las modificaciones Email. [email protected] Pagina 1/10 de o parches a nivel de aplicación. Ahora veamos técnicamente la implementación Karlo Espinoza esta característica. 9 Optimazer Hints Gerber Bautista Debbie Moran Francisco Barrundia Luis Cordón Autores Contribuyentes Se ha introducido el objeto EDITION, el cual permite manejar diferentes versiones de un objeto a la vez; por ejemplo un paquete puede tener más de una instancia u ocurrencia a la vez, pero solo una es la versión o edición activa a nivel de base de datos. La edición actual puede identificarse a través de la vista database_properties: select property_name,property_value from database_properties where property_name='DEFAULT_EDITION' Luis Fernando Alonzo Iván García Gerber Bautista PROPERTY_NAME PROPERTY_VALUE ------------------------------ -----------------------------DEFAULT_EDITION ORA$BASE Francisco Barrundia Por defecto la base de datos tiene creada y habilitada la edición ORA$BASE; las nuevas ediciones o versiones se crean como hijas de esta. Toda base de datos 11.2 tiene por lo menos una edición y una edición por defecto habilitada. 5a. Ave. 5-55 Zona14, Edificio Euro Plaza Torre II, Nivel 12 Teléfono: (502)2364-5300 Fax: (502)2364-5311 Email. [email protected] Página 1 SQL> create edition version2 as child of ora$base; Edition created. Al crear la edición nueva VERSION2, esta hereda toda la funcionalidad manejada en la versión padre ora$base. La edición creada es una copia virtual de su predecesor; solo se creara copias de los objetos cuando estos son modificados en el contexto de la nueva edición. Para permitir a un usuario ver y utilizar la nueva edición creada, se debe asignar los privilegios necesarios: SQL> alter user myapp enable editions; User altered. SQL> grant use on edition version2 to myapp; Grant succeeded. A través de la instrucción alter user enable editions se habilita el uso de más de una edición para la cuenta myapp; el grant permite a la misma cuenta el uso específicamente de la edición VERSION2. A partir de este punto, podemos cambiar a nivel de sesión (en la cuenta myapp) la edición en la cual estamos trabajando, y hacer modificaciones a los objetos, sin afectar a los usuarios que están trabajando sobre los objetos con edición diferente. Veamos el siguiente ejemplo: SQL> conn myapp/myapp Connected. SQL> alter session set edition=version2; Session altered. SQL> select object_name,edition_name from user_objects; OBJECT_NAME EDITION_NAME ------------------------------ -----------------------------MY_PROC ORA$BASE MY_PROC2 ORA$BASE SQL> select sys_context('userenv','current_edition_name') from dual; SYS_CONTEXT('USERENV','CURRENT_EDITION_NAME') --------------------------------------------VERSION2 Hacemos modificación al procedimiento actual, pero sobre la edición VERSION2: SQL> create or replace procedure my_proc as 2 begin 3 dbms_output.put_line('Version 2.0'); 4 end; 5 / Procedure created. 5a. Ave. 5-55 Zona14, Edificio Euro Plaza Torre II, Nivel 12 Teléfono: (502)2364-5300 Fax: (502)2364-5311 Email. [email protected] Página 2 SQL> r 1* select object_name,object_type,status,edition_name from user_objects OBJECT_NAME OBJECT_TYPE STATUS EDITION_NAME --------------- ------------------- ------- -----------------------------MY_PROC2 PROCEDURE VALID ORA$BASE MY_PROC PROCEDURE VALID VERSION2 SQL> exec my_proc2; Version 2.0 PL/SQL procedure successfully completed. SQL> alter session set edition=ora$base; Session altered. SQL> exec my_proc2; Version 1.0 PL/SQL procedure successfully completed. El procedimiento my_proc2 lo único que hace es una llamada al procedimiento my_proc; vemos que después de ser modificado, el campo EDITION_NAME sobre la vista user_objects aparece como VERSION2; los cambios hechos se ven reflejados solo si se está utilizando la edición VERSION2; no se invalidan objetos dependientes, y al cambiar al contexto a la edición original (ora$base) el código sigue funcionando como originalmente estaba. Ahora el único intervalo de tiempo necesario para hacer visibles los cambios a uno o varios procedimientos, funciones, paquetes es el necesario para ejecutar un ALTER DATABASE que define la edición por defecto. SQL> alter database default edition=version2; Database altered. SQL> conn myapp/myapp Connected. SQL> exec my_proc2; Version 2.0 PL/SQL procedure successfully completed. Y si es necesario retornar a la versión anterior, simplemente se realiza el cambio para la edición originalmente definida: SQL> alter database default edition=ora$base; Database altered. SQL> conn myapp/myapp Connected. SQL> exec my_proc2; Version 1.0 PL/SQL procedure successfully completed. 5a. Ave. 5-55 Zona14, Edificio Euro Plaza Torre II, Nivel 12 Teléfono: (502)2364-5300 Fax: (502)2364-5311 Email. [email protected] Página 3 Si los cambios a introducir en el ambiente de producción son solamente sobre objetos basados en PL/SQL, vistas y sinónimos, lo que hemos visto hasta el momento es suficiente para minimizar el tiempo fuera de línea necesario. Ahora bien, cuando se introduce un cambio a un objeto basado en código PL/SQL, por lo regular va asociado a modificaciones sobre tablas u objetos similares; un cambio podría ser agregar columnas a una tabla. Para este tipo de modificaciones, siempre se requeriría tiempo fuera de línea y se generará invalidación de objetos dependientes. Para proporcionar una solución integral a modificaciones sobre ambientes de producción, se introdujo dos objetos adicionales a EDITION: • • Editioning View: Es una vista con columnas solamente visibles para una edición particular; permite introducir modificaciones a estructuras de almacenamiento sobre una nueva edición, y los usuarios de ediciones anteriores continúan viendo las estructuras de datos tal como están definidas originalmente. Crossedition Trigger: Es un trigger especial que permite enviar los cambios generados en una tabla de una edición anterior a la nueva edición Con estos tres objetos: edition, editioning view y crossedition trigger que forman la característica Edition Based Redefinition se ha mejorado la disponibilidad del servicio de base de datos. Vemos que el objetivo de Oracle es minimizar el tiempo que toma la realización de tareas de mantenimiento, y así proveer una disponibilidad de servicio del 100%. Alta Disponibilidad para Oracle Internet Directory Por: Ing. Iván García [email protected] Conforme los servicios informáticos se hacen cada vez más imprescindibles el costo de detener las operaciones también aumenta. Un fallo que impida a los usuarios acceder a las aplicaciones puede traducirse en mercadería perdida, contratos cancelados, atrasos en entregas, etc. en pocas palabras, pérdidas importantes que dañan no solo el estado financiero de la empresa sino muchas veces su reputación. Para evitar o reducir significativamente el tiempo que nuestros servicios estén inoperantes se habla de arquitecturas de Alta Disponibilidad. Cuando se habla sobre Alta Disponibilidad se refiere que los servicios pueden estar trabajando de forma continua 7x24 (todo el día todos los días) , por supuesto, existirán momentos en que los servicios se puede detener ya sea por razones planificadas (upgrades, aplicación de parche, etc.) o por razones no planificadas (fallo de hardware, fallo de software, fallo eléctrico, etc.). Y la Alta Disponibilidad busca que estos tiempos sean lo más cortos posibles acercándonos a un porcentaje de servicio cercano al 99.9%. 5a. Ave. 5-55 Zona14, Edificio Euro Plaza Torre II, Nivel 12 Teléfono: (502)2364-5300 Fax: (502)2364-5311 Email. [email protected] Página 4 La Alta Disponibilidad se puede reducir a una sola palabra que nos permite comprender de mejor forma la arquitectura: REDUNDANCÍA. El concepto fundamental de redundancia es que exista dos o más de algo, y en la arquitectura de Alta Disponibilidad se refiere a dos o más de todo. De esta forma se evita que exista un único punto de falla, por lo que se debe pensar en todos los componentes que conformen el sistema que queramos en Alta Disponibilidad. Oracle Internet Directory (OID), componente fundamental de los servicios de seguridad de Oracle Application Server, es el encargado de servir como repositorio de los usuarios, grupos y credenciales que dan acceso a las aplicaciones, ya sean de Forms, Java, Discoverer, etc. El OID muchas veces no es tomado en cuenta como parte fundamental del sistema, sin embargo, si éste falla no importará que las aplicaciones se encuentren arriba ningún usuario tendrá acceso a ellas hasta que se restablezca el OID. Por lo tanto en esta ocasión nos centraremos en las características del OID que permiten su implementación de Alta Disponibilidad. Implementaciones de OID para Alta Disponibilidad El OID ofrece distintos tipos de implementación para distintas necesidades, la flexibilidad que brinda al momento del instalarse es muy grande y se puede aumentar mucho más con las distintas configuraciones. A continuación se presentan únicamente dos soluciones que permiten la Alta Disponibilidad de los servicios del OID. Cluster de OID Un cluster se refiere a dos o más entidades trabajando como una sola, es decir, al cliente se le presenta una única interfaz y detrás de ésta se encuentran varios componentes que brindan el mismo servicio accediendo a la misma información. El OID puede instalarse en cluster, de esta forma se tienen dos o más instancias de OAS ejecutando el OID como se muestra en la imagen a continuación. Los servidores ServerA y ServerB tienen instalado ambos el OID y comparten un mismo repositorio de Base de Datos donde se encuentra la información almacenada. Para que el ambiente de Alta Disponibilidad sea completo el repositorio debe ser una Base de Datos configurada en RAC y el único punto de entrada que es el Load Balancer también debe tener su respaldo. Los clientes tendrán como punto de acceso el balanceador así siempre y cuando al menos un servidor preste el servicio los clientes pueden seguir trabajando. 5a. Ave. 5-55 Zona14, Edificio Euro Plaza Torre II, Nivel 12 Teléfono: (502)2364-5300 Fax: (502)2364-5311 Email. [email protected] Página 5 Es importante señalar que esta configuración se realiza desde el momento de la instalación y puede constar desde un solo nodo (simulando un stand alone) hasta n nodos. Los nodos se pueden agregar en caliente. Replicación de OID La replicación de OID significa que existen dos o más servidores que ejecutan los servicios de OID pero cada OID consta de su propio repositorio, por lo tanto, se crea un proceso que se mantiene copiando la información entre los OIDs. De esta forma se logra tener duplicidad de la información, ahora bien, el tener la información duplicada en varios repositorios conlleva un problema: la consistencia de la información a través de los distintos repositorios. Saber cómo manejar la consistencia en la replicación dependerá del tipo de replicación que utilicemos. Las siguientes son dos de las configuraciones más comunes: • • Maestro – Esclavo Multi-Maestro Replicación Maestro-Esclavo En este tipo de replicación se define un nodo de OID como el repositorio principal y único autorizado para realizar modificaciones. Los demás nodos de OID son considerados Esclavos y se pueden utiliza como repositorios de solo lectura. Replicación Multi-Maestro Este tipo de replicación permite que todos los nodos de OID involucrados puedan realizar operaciones de escritura y lectura. De esta forma no importa a que nodo se conecte un cliente todos verán siempre la misma información. 5a. Ave. 5-55 Zona14, Edificio Euro Plaza Torre II, Nivel 12 Teléfono: (502)2364-5300 Fax: (502)2364-5311 Email. [email protected] Página 6 ¿Qué Arquitectura A a Utilizar? Cuál es la mejor im mplementación n de OID que e se pueda uttilizar depend derá de las ne ecesidades que q tengam mos en nuestrra empresa. Es importante e determinar cuánto tiemp po se es perm mitido estar sin n operar, evaluar el costo c del hard dware necesa ario para implementar la so olución, y no se debe olvid dar el costo de administtración de loss sistemas. Si se busca b una sollución comple eta de Alta Disponibilidad la l opción de Cluster C de OID deberá serr la primera a a tomar en cuenta. Para ma ayor información se puede consultar: http://www.o oracle.com/techn nology/products/o oid/ Encrip ptación de d datos Oracle Stand dard Edition Por: Ing g. Gerber Bau utista [email protected] om.gt La Enccriptación es una herramienta valiosa que ofrece un u nivel de protección p de datos tanto en transm misión como en almacenam miento. Cripto ografía: “Rama a de las Matem máticas y en la actualidad d de la Inform mática y la Telemática que q hace uso u de méto odos y técnicas matem máticas con el e objeto principal de cifra ar un mensajje o archivo o por medio de d un algoritm mo, usando un na o más clavves” En criptografía, la información original que debe protege erse se den nomina texto en claro o texto plano. El cifrado es e el processo de converttir el texto pla ano en un ga alimatías ilegible, denom minado texto cifrado o criiptograma. Por lo genera al, la aplicacción concreta del algoritmo o de cifrado (también ( llam mado cifra) se s basa en la existencia a de una cllave: informa ación secreta a que adapta a el algoritm mo de cifrado o para cada uso distinto o. Encri ptación en Oracle Una nu ueva característica a partiir de Oracle 10g Release 2 es TDE (T Transparent Data D Encriptio on) con essta se puede declarar d una columna com mo cifrada sin n utilizar una sola s línea de código, cuan ndo los usu uarios inserta an datos la ba ase de datos realiza el cifrado de forma a trasparente y almacena los datos de d la misma manera al rea alizar la seleccción. Por ra azones de licenciamien l nto TDE está á disponible e solamente en la versión Enterpriise Edition n de base de e datos. En la versión Stan ndard y Perssonal de basse de datos tenemos la posibilidad de d realizar una u encripccion de datos s por medio del paquete DBMS_OBF FUSCATION_ _TOOLKIT esste nos perm mite utilizar los algoritmo os de DES y TripleDES. T 5a. Ave.. 5-55 Zona14, Edificio E Euro Pla aza Torre II, Niv vel 12 Teléfono o: (502)2364-5300 Fax: (502)23 364-5311 Email. in [email protected] Página a 7 Características y restricciones al utilizar DBMS_OBFUSCATION_TOOLKIT La encriptación puede ser realizada por algoritmos DES y TripleDES. Solo se pueden encriptar datos de tipo convertible a varchar2(1 a 4000) o RAW. Los datos a encriptar deben de tener una longitud múltiplo de 8. No se pueden encriptar llaves primarias ni foráneas. La longitud mínima del key es de 16 caracteres y la máxima es 56. Tip técnico del día: Personalizar SQL*Plus: Link: http://soporte.datum.com.gt/welcome/tip.jsp Aquellos que estan familiarizados con el diccionario de datos de Oracle pueden utilizar algunos querys sencillos para determinar alguna falla de seguridad como por ejemplo: Para determiar que usuarios tienen privilegios con la capacidad “dar” estos privilegios a terceros, se excluyen usuarios del sistema: select grantee, privilege, admin_option from sys.dba_sys_privs where admin_option = 'YES' and grantee not in (‘SYS’,’SYSTEM’, etc); Para determinar usuarios con privilegios de rol con opción de ADMIN: select grantee, granted_role, admin_option, default_role from sys.dba_role_privs where admin_option = 'YES' and grantee not in (‘SYS’,’SYSTEM’, etc); Funciones de encriptación y desencriptación: Dada las características del paquete al utilizar DES y TripleDES se debe de tomar en cuenta que las funciones tendrán que convertir su entrada en un múltiplo de 8, a continuación se proponen las siguientes funciones: Función de encriptación: create or replace function encriptar(val in varchar2) return varchar2 is v_string varchar2(4000):= val; begin if v_string is null then v_string:=' '; end if; if mod(length(v_string),8) != 0 then v_string := v_string||lpad(chr(0),8mod(length(v_string),8),chr(0)); end if; return dbms_obfuscation_toolkit.des3encrypt(input_string=>v_st ring,key_string=>'1234567891234567'); end; / Función de desencriptación: create or replace function des_a(val in varchar2) return varchar2 is v_string VARCHAR2(4000); begin v_string := dbms_obfuscation_toolkit.des3decrypt(input_string=>val, key_string=>'1234567891234567'); return rtrim(v_string,chr(0)); end; Por Lic. Francisco Barrundia [email protected] 5a. Ave. 5-55 Zona14, Edificio Euro Plaza Torre II, Nivel 12 Teléfono: (502)2364-5300 Fax: (502)2364-5311 Email. [email protected] Página 8 Optimizer Hints Por: Lic. José Francisco Barrundia [email protected] Optimizer Hints Que puede hacer en el caso hipotético donde usted sabe que hay un plan de ejecución más eficiente para un query en especifico que el que oracle le sugiere?... hay una forma de modificar el “camino” que oracle recorrería para ir a traer sus datos de la manera más rápida posible, y usted puede indicarle como con los Hints de SQl. Tipos de hints: Existen varios tipos de hints , entre estos encontramos: • • • • Single table Hints - Estos incluyen a una sola tabla o vista únicamente. Multitable Hints – Definimos múltiples tablas o vistas Query Block Hints – Operan sobre un solo bloque de query Statement Hints - Se aplica sobre todo la sentencia sql Reglas para utilizar los Hints ‐ ‐ ‐ Coloque el hint inmediatamente después de introducir la palabra clave select en la sentencia. Cada bloque puede tener solo una sección de hints pero puede especificar multiples hints. Los hints solo aplican para la sentencia donde son definidos Ejemplo: En el ejemplo de arriba se instruye al optimizador basados en costos que utilice el índice el plan de ejecución es el siguiente: 5a. Ave. 5-55 Zona14, Edificio Euro Plaza Torre II, Nivel 12 Teléfono: (502)2364-5300 Fax: (502)2364-5311 Email. [email protected] Página 9 Execution Plan ---------------------------------------------------------0 1 2 3 UPDATE STATEMENT Optimizer=ALL_ROWS (Cost=3 …) 0 UPDATE OF 'PRODUCTS' 1 TABLE ACCESS (BY INDEX ROWID) OF 'PRODUCTS' (TABLE) (Cost…) 2 INDEX (RANGE SCAN) OF 'PRODUCTS_PROD_CAT_IX' (INDEX) (cost…) 1 TABLE ACCESS (BY INDEX ROWID) OF 'PRODUCTS' (TABLE) (Cost…) 4 INDEX (UNIQUE SCAN) OF 'PRODUCTS_PK' (INDEX (UNIQUE)) (Cost=0 …) 4 5 Categorías de Hints Hay varias categorías de Hints cubriremos 3: ‐ ‐ ‐ Aproximaciones de optimización Caminos de acceso Orden de la Unión de tablas Aproximaciones de optimización: Tenemos la clausula All_Rows: El ALL_ROWS es una sugerencia explícita para que oracle escoja el método basado en los costes para optimizar un bloque de instrucciones con el objetivo de mejor rendimiento (es decir, el consumo mínimo total de recursos). Ejemplo: SELECT /*+ ALL_ROWS */ employee_id, last_name, salary, job_id FROM employees WHERE employee_id = 7566; First_Rows(n): Donde n es un entero positivo le da instrucciones al servidor de Oracle para optimizar una declaración individual de SQL para una respuesta rápida. FIRST_ROWS (n) otorga una mayor precisión, ya que indica al servidor que elegir el plan que devuelve n filas de manera más rápida y eficiente. Ejemplo: SELECT /*+ FIRST_ROWS(10) */ employee_id, last_name, salary, job_id FROM employees WHERE department_id = 20; En este ejemplo cada departamento tiene muchos empleados pero queremos optimizar el query para que nos devuelva los primeros 10 resultados lo más rápido posible. 5a. Ave. 5-55 Zona14, Edificio Euro Plaza Torre II, Nivel 12 Teléfono: (502)2364-5300 Fax: (502)2364-5311 Email. [email protected] Página 10 Caminos de acceso: FULL: Hace un escaneo completo a la tabla. Ejemplo: SELECT /*+ FULL(e) */ employee_id, last_name WHERE last_name LIKE 'K%'; FROM hr.employees e Esta sentencia hace un escaneo completo a la tabla a pesar de que existe un índice en el campo apellido que se utiliza en la clausula where. ROWID: Accede una tabla por rowid SELECT /*+ROWID(employees)*/ * FROM employees WHERE rowid > 'AAAAtkAABAAAFNTAAA' AND employee_id = 155; INDEX: Escanea un índice en orden ascendente Esta clausula especifica un barrido de índice a una tabla en especifico se pueden utilizar índices B Tree , Bitmap y Bitmap Join, podemos especificar uno o múltiples índices: select /*+ index(emp_alias ix_emp) */ ... from scott.emp emp_alias Orden de la unión de las tablas ORDERED: instruye al servidor de Oracle a unir las tablas en el orden en que aparecen en la clausula from de la sentencia select. SELECT /*+ORDERED */ o.order_id, c.customer_id, l.quantity FROM customers c, order_items l, orders o WHERE c.cust_last_name = :b1 AND o.customer_id = c.customer_id AND o.order_id = l.order_id; l.unit_price * LEADING: Utiliza la tabla o tablas especificadas como la primera en al unión de las tablas. SELECT /*+ LEADING(e j) */ * FROM employees e, departments d, job_history j WHERE e.department_id = d.department_id AND e.hire_date = j.start_date 5a. Ave. 5-55 Zona14, Edificio Euro Plaza Torre II, Nivel 12 Teléfono: (502)2364-5300 Fax: (502)2364-5311 Email. [email protected] Página 11 Nue evo Web Site Le invittamos a visita ar nuestro totalmente nuevo sitio web, una nueva he erramienta de e contacto al servicio o de nuestros s clientes. Ing grese a www w.datum.com.gt para cono ocer más sobre nuestros servicio os, productos s, noticias, etcc. 5a. Ave.. 5-55 Zona14, Edificio E Euro Pla aza Torre II, Niv vel 12 Teléfono o: (502)2364-5300 Fax: (502)23 364-5311 Email. in [email protected] Página 12 Gracias a la retroalimentación de nuestros clientes, Datum – Educacional estará impartiendo el siguiente curso: Oracle Database 10g: Administrtion Workshop I Qué aprenderá: Este curso es su primer paso hacia el éxito como un profesional Oracle, diseñado para darle fundamentos en administración básica de una base de datos. En esta clase, aprenderá como instalar y mantener una base de datos Oracle. Tendrá un mayor conocimiento conceptual de la arquitectura de la base de datos y de cómo sus componentes internos trabajan e interactúan entre sí. También aprenderá a crear una base de datos operacional y manejar apropiadamente las diferentes estructuras de una manera efectiva y eficiente que incluye monitoreo de rendimiento, seguridad de base de datos, administración de usuarios, y técnicas de respaldo y recuperación. Los conceptos teóricos son reforzados con prácticas estructuradas. Este curso está diseñado para prepararlo para el correspondiente examen para ser Asociado Certificado de Oracle (OCA). Aprenda a: • • • • • • Instalar la base de datos Respaldo y recuperación de los datos Administrar usuarios Transportar datos entre bases de datos Administrar los datos Configurar la red para base de datos Objetivos del curso: • • • • • Instalar y configurar la base de Datos Oracle 10g Crear y administrar cuentas de usuarios en la base de datos Oracle 10g Respaldo y recuperación de la base de datos Oracle 10g Monitorear, diagnosticar, y mantener la base de datos Oracle 10g Configurar los servicios de red para la base de datos Oracle 10g Retroalimentación, comentarios, temas de interés y sugerencias para hands‐on sessions: [email protected] 5a. Ave. 5-55 Zona14, Edificio Euro Plaza Torre II, Nivel 12 Teléfono: (502)2364-5300 Fax: (502)2364-5311 Email. [email protected] Comentarios y Sugerencias: Su opinión es muy importante; si desea hacernos algún comentario o sugerencia, por favor escríbanos al correo electrónico: [email protected]. Página 13