MTBASE / SYBASE DE COLOMBIA
 
Búsqueda avanzada...
Versión para imprimir Versión para imprimir Enviar vínculo por e-mail Enviar por e-mail Ver atributos del documento Atributos del documento
 

Generación de Sentencias DDL con ddlgen

Una Mirada Más de Cerca a la Nueva Herramienta Cliente de ASE

Cuando Adaptive Server Enterprise (ASE) 12.5 fue liberado a mediados del año 2001, una de sus nuevas características fue una nueva herramienta cliente llamada ddlgen. Esta hace lo que su nombre sugiere: Genera sentencias DDL Transact-SQL para los objetos de una base de datos existente. En otras palabras, ddlgen realiza ingeniería reversa del esquema. Recuerde que "DDL" significa "Data Definition Language" (Lenguaje de Definición de Datos) y es un nombre colectivo para las sentencias que manipulan el esquema (pero no los datos de una base de datos) tales como create table, create procedure, etc. Seguramente cada DBA verá el potencial de esta herramienta de ingeniería reversa; en éste documento discutiremos algunos detalles técnicos de ddlgen.

Dónde Encontrar ddlgen

ddlgen es una aplicación Java la cual es ejecutada desde la línea de comandos del sistema operativo. (No hay que confundir esto con la muy promovida característica de "Java en ASE": ddlgen se ejecuta fuera de ASE). La ubicación de ddlgen depende de la versión de ASE:

  • ASE 12.5.0: $SYBASE/sybcent32 (Unix) o %SYBASE%\Sybase Central 3.2 (Windows)
  • ASE 12.5.1 en adelante: $SYBASE/ASEP/bin (Unix) o %SYBASE%\ASEP\bin (Windows)

Aunque ddlgen está disponible para los DBAs como una herramienta independiente, también es usada por otras aplicaciones Sybase, incluyendo la versión Java de Sybase Central y la herramienta sybmigrate (nueva en ASE 12.5.0.1. Para mayor información sobre sybmigrate vea el documento 'Sybase ASE 12.5: Migración a Nuevos Tamaños de Página Usando Sybmigrate', DocId=10123).

Cómo Trabaja ddlgen

ddlgen puede realizar ingeniaría reversa de objetos individuales de la base de datos o de bases de datos enteras de un servidor ASE. Por ejemplo ("%" indica el prompt de Unix; "#" indica un comentario):

# ingeniería reversa de toda la base de datos 'prod'

% ddlgen -Ulogin1 -Ppasswd -Spluto:5001 -Dprod

ddlgen imprimirá todas las sentencias create necesarias para recrear el esquema actual de la base de datos prod (note que ddlgen no incluye ningún comando drop). Por defecto, ddlgen imprime las sentencias DDL generadas hacia la salida estándar. Esto rápidamente se convierte en una gran cantidad de texto: aún para una tabla simple de una columna, ddlgen genera 21 líneas de salida (en parte debido a que incluye líneas adicionales con comentarios para una mejor legibilidad del DDL).
        A continuación una porción de la salida del ddlgen anterior:

-----------------------------------------------------------------------------
-- DDL for Database 'prod'
-----------------------------------------------------------------------------
print 'prod'

use master
go

create database prod on pruebas_dat = 3
go

-----------------------------------------------------------------------------
-- DDL for Rule 'prod.dbo.pub_idrule'
-----------------------------------------------------------------------------
print 'Creating Rule pub_idrule'
go

use prod
go

setuser 'dbo'
go

create rule pub_idrule
as @pub_id in ("1389", "0736", "0877", "1622", "1756")
or @pub_id like "99[0-9][0-9]"
go

setuser
go

-----------------------------------------------------------------------------
-- DDL for Rule 'prod.dbo.title_idrule'
-----------------------------------------------------------------------------
print 'Creating Rule title_idrule'
go

use prod
go

setuser 'dbo'
go

create rule title_idrule
as
@title_id like "BU[0-9][0-9][0-9][0-9]" or
@title_id like "[MT]C[0-9][0-9][0-9][0-9]" or
@title_id like "P[SC][0-9][0-9][0-9][0-9]" or
@title_id like "[A-Z][A-Z]xxxx" or
@title_id like "[A-Z][A-Z]yyyy"
:
:

Opciones de Línea de Comando

ddlgen acepta un número de opciones de línea de comando que le permiten realizar ingeniería reversa de objetos específicos. Las opciones más importantes son -D, para especificar una base de datos; -T, para especificar el tipo de objeto de base de datos, y -N para especificar un patrón para el nombre de un objeto. Por ejemplo, para generar el DDL de todas las tablas de usuario en la base de datos prod cuyos nombres comiencen con la letras "A":

# ingeniería reversa de las tablas que comienzan con la letra 'A'

% ddlgen -Ulogin1 -Ppasswd -Spluto:5001 -Dprod -TU -NA%

Esta es la lista completa de tipos de objeto que pueden ser usados con la opción -T:

C - Cache I - Indice RS - Servidor Remoto
DB - Base de Datos KC - Restricciones de llave primaria/única SG - Segmento
D - Valor por Defecto   TR - Trigger
DBD - Dispositivo de Base de Datos L - Login U - Tabla de Usuario
DPD - Dispositivo de Dump P - Procedimiento Alamcenado UDD - Tipo de Dato Definido por Usuario
EC - Clase de Ejecución R - Regla USR - Usuario
EG - Grupo de Motores RI - Restricciones de Integridad Referencial V - Vista
GRP - Gripo de Usuarios RO - Rol XP - Procedimiento Alamcenado Extendido

Como se muestra en la tabla de arriba, a los objetos a nivel de servidor, tales como logins y roles también se les puede realizar ingeniería reversa:

# ingeniería reversa de todos los logins

% ddlgen -Ulogin1 -Ppasswd -Spluto:5001 -TL -N%

Las opciones de línea de comando -X y -F permiten filtración adicional en combinación con -T.

El conjunto completo de opciones de comando de ddlgen es el siguiente:
-U login_name: El login usado para conectarse a ASE
-P password: La contraseña del login
-S hostname:port: Nombre del servidor (máquina) y puerto del ASE al que se va a conectar
-D db_name: El nombre de la base de datos; si se omite, se asume el nombre de la base de datos predeterminada del login
-T object_type: El tipo de objeto al cual se le va a realizar ingeniería reversa (ver la tabla de arriba; por defecto es DB)
-N object_name: Siempre debe ser usado con -T para especificar el nombre del objeto. Puede contener patrones o ser un nombre completo (por ejemplo, db_name.owner.table_name[.index]). Por defecto, especifique -N%
-XOU
o -XOD: Estas opciones son usadas en combinación con -TU: con -XOU, solo tablas de usuario se incluyen; con -XOD, solo tablas proxy. Al especificar solo -TU, sin -X, incluye tanto tablas de usuario como tablas proxy
- F{TR|I|KC|RI|%}: Para tablas de usuario, no genere triggers (TR), índices (I), restricciones de llave primaria/única (KC), restricciones de integridad referencial (RI) para esa tabla(s). Estas opciones pueden ser combinadas con comas. % excluye todas las anteriores; -F solo no tiene ningún efecto
-O output_file: Archivo de salida para el DDL generado (por defecto la salida estándar)
-E error_file: Archivo para registrar errores
-J charset: Juego de caracteres del cliente
-v: Información sobre la versión de ddlgen

Ingeniería Reversa de Tablas #temp

Aunque esta capacidad no está documentada, ddlgen generará DDL para tablas temporales que pertenezcan a otras sesiones. Para llevar a cabo esto, especifique la base de datos tempdb y use '%' o especifique el nombre completo de la tabla:

# ingeniería reversa de todas las tablas temporales

% ddlgen -Usa -Ppasswd -Spluto:5001 -Dtempdb -TU -N#%

# ingeniería reversa de una tabla temporal específica

% ddlgen -Usa -Ppasswd -Spluto:5001 -Dtempdb -TU -N#t____________00000160012632096

Aparte de escribir consultas sobre las tablas del sistema de tempdb, prácticamente no existe ninguna otra manera de llevar a cabo ingeniería reversa de tablas temporales. 

Algunos Consejos

  1. La primera versión de ddlgen se incluyó como parte de ASE 12.5. Desafortunadamente, esta primera versión contenía algunos problemas perturbadores en los DDL generados. Estos problemas fueron resueltos en versiones posteriores, luego recomendamos actualizar a por lo menos la versión 12.5.0.1 de ASE.

Vara verificar su versión de ddlgen, ejecute ddlgen -v. La versión 12.5 de ddlgen imprimirá una sola línea:

% ddlgen -v

Product Release Version: 1.0, for ASE 12.5

Versiones más recientes de ddlgen (como la 15.0) imprimen información más completa sobre la versión, así como información sobre los derechos de copia de Sybase:

% ddlgen -v

Sybase DDLGen Utility/15.0/ESD #1 Build 1/S/1.4.2/ase150/Fri Oct 21 20:03:58 PDT 2005

  1. El origen Java de ddlgen es visiblemente claro: como se ilustra en los ejemplos de éste documento, ddlgen requiere que el servidor ASE sea especificado como hostname:port (al estilo de JDBC). Esto es un poco inconveniente ya que los DBAs de ASE están acostumbrados a especificar el nombre del servidor ASE. Esto, sin embargo, será corregido en nuevas versiones de ddlgen. Por el momento, la forma más rápida de encontrar el número del puerto de ASE es usar los utilitarios dsedit o dscp (solo en Unix).
  2. Por alguna razón, ddlgen no tolera espacios entre una opción de línea de comando y su valor. Por ejemplo ddlgen -U sa (con un espacio entre -U y sa) resultará en un error: usted debe especificar -Usa sin el espacio.
  3. Al usar la opción -T para especificar el tipo de objeto, -N% también debe ser especificado también. Si se omite -N% esto causará que se genere un mensaje de error.

Qué no Hace ddlgen

A pesar de su utilidad, no es sorpresa el hecho de que ddlgen tenga también sus limitaciones:

  • ddlgen no puede llevar a cabo ingeniería reversa de objetos compilados cuyo código haya sido encriptado con sp_hidetext.
  • Para logins y roles, ddlgen no realiza ingeniería reversa de contraseñas (que están almacenadas de forma encriptada).
  • ddlgen no puede llevar a cabo ingeniería reversa de logins externos o logins remotos.
  • ddlgen no siempre considera todas las dependencias entre objetos. Vea la siguiente sección para mayor información.

Dependencias Entre Objetos

Idealmente, el DDL generado se debe poder ejecutar sin errores. Un problema clásico para las herramientas de ingeniería reversa son las dependencias entre objetos de la base de datos. Por ejemplo, cuando el procedimiento P lee de la tabla T, el DDL de la tabla T debió haber sido generado antes que el DDL del procedimiento P -- ya que de otra manera se generará un error al ejecutar el DDL de P ya que la tabla T no existe.

ddlgen lleva a cabo un esfuerzo razonable al tomar en cuenta las dependencias entre objetos, pero no es perfecto. Cuando su DDL generado arroja errores, el remedio más simple es ejecutar el DDL otra vez. Los objetos que no pudieron ser creados la primera vez porque otros objetos no existían, serán creados la segunda vez (esto es posible ya que ddlgen no incluye comandos drop en los DDLs generados). La desventaja de éste método es que es desordenado. Durante la segunda ejecución del DDL, para cada tabla, índice, procedimiento almacenado, etc. habrá un mensaje de error indicando que el objeto ya existe. Esto hará más difícil determinar si todos los objetos han sido finalmente creados de manera correcta.

De manera alterna, usted también puede realizar explícitamente ingeniería reversa de los objetos por tipo usando las opciones -T y -F (ver arriba).

El Problema Clásico de la "Tabla del Procedimiento"

Un problema clásico es el del procedimiento almacenado que hace referencia a una tabla creada por fuera del procedimiento. ddlgen no resuelve este problema. Ejemplo:

create table #t1(a int)
go
create procedure p as
select * from #t1
go

La sentencia create table debe ejecutarse primero, o la creación del procedimiento almacenado p fallará, ya que hace falta la tabla #t1.

ddlgen llevará a cabo la ingeniería reversa del procedimiento p, pero este no incluirá la sentencia create table. Esto significa que cuando el DDL generado sea ejecutado, resultará en un error ya que la tabla #t1 no existe. Esto se debe a que ddlgen obtiene el texto SQL de la tabla del sistema syscomments, el cual no contiene la sentencia create table y que esta no es parte del texto SQL del procedimiento almacenado. Los DBAs deberán tratar estos casos manteniendo sus propios DDLs, que contengan ambos comandos, el create table y el create procedure.

Compatibilidad con Versiones Anteriores

Como se mencionó en la introducción, ddlgen fue introducido en ASE 12.5. Sin embargo, ddlgen también trabaja sobre versiones anteriores de ASE, a pesar de ciertas limitantes. Por favor note que la información que sigue fue determinada empíricamente. ddlgen es formalmente soportada sólo en ASE 12.5 o posterior.

Hasta ahora se pudo determinar que ddlgen trabaja bien sobre ASE 12.0, para todos los tipos de objetos. Sobre ASE 11.9 y 11.5, a algunos objetos se les puede aplicar ingeniería reversa, pero a otros no. Por ejemplo, a las tablas de usuario no se les puede aplicar ingeniería reversa en servidores anteriores al 12.0 ya que ddlgen espera encontrar la columna sysindexes.identitygap (así que el ddlgen falla). A otros objetos como índices, logins, roles, o cachés, se les puede aplicar ingeniería reversa exitosamente en servidores 11.9 y 11.5.

No se ha podido correr ddlgen sobre ASE 11.0; algunos problemas de conectividad hacen que ddlgen no se pueda conectar exitosamente.

Atributos del Documento
Resumen: Este documento discute algunos detalles técnicos de la herramienta cliente ddlgen, utilizada para realizar ingeniería reversa de objetos en Adaptive Server Enterprise.
Código: 10132 Última Modificación: Mar 23, 2006
Temas: Administración Tipo de Documento: Documento Técnico
Productos: Adaptive Server Enterprise Versión: 12.5.x en adelante
Plataformas: Todas las Plataformas Sistema Operativo: Todos los Sistemas Operativos
 
 Inicio   Sobre MTBASE   Sobre Sybase   Empleos en MTBASE   Mapa del Sitio   Aspectos Legales y Políticas de Privacidad