Ejecutando un script desde Visual FoxPro

Deja un comentario

A veces podría ocurrir que necesitamos ejecutar los comandos DDL (los que crean tablas, índices, stored procedures, etc.) o DML (los que insertan, actualizan, borran, consultan datos) desde nuestra aplicación en Visual FoxPro.

La forma más fácil de conseguirlo es a través de un script. Como crear un script habíamos visto en este artículo:

https://firebird21.wordpress.com/2013/05/22/entendiendo-a-los-scripts/

Nuestro script debe consistir de:

  1. SET SQL DIALECT 3;     (si vamos a crear una Base de Datos)
  2. El comando CONNECT o el comando CREATE DATABASE     (si vamos a usar una Base de Datos que no está abierta. Si la Base de Datos ya está abierta estos comandos no serán necesarios)
  3. Los comandos que deseamos ejecutar
  4. El comando COMMIT o la instrucción SET AUTODDL ON

Para ejecutarlo, en la misma carpeta donde se encuentra nuestra aplicación (o en el PATH de búsqueda) debemos tener los archivos:

  • FBCLIENT.DLL
  • ISQL.EXE

Y ejecutamos al programa ISQL.EXE con las opciones -q (para que no muestre el mensaje “CONNECT or CREATE DATABASE …”, -i (para pedirle que ejecute un script) y el nombre del script.

Ejemplo:

Con el bloc de notas del Windows creamos el script “PRUEBA.SQL” que tiene este contenido:

CONNECT MIBASEDATOS USER SYSDBA PASSWORD masterkey;

CREATE TABLE PRUEBA (
   NUMERO INTEGER,
   NOMBRE VARCHAR(40),
   FECHA DATE
);

COMMIT;

INSERT INTO PRUEBA
        (NUMERO, NOMBRE, FECHA)
 VALUES (123 , 'HOLA', CURRENT_DATE);

COMMIT;

Y desde nuestro programa en Visual FoxPro lo ejecutamos de esta manera:

RUN ISQL -q -i "PRUEBA.SQL"

o de esta otra manera (la cual es preferible porque no mostrará el destello de la ventana negra “Símbolo del sistema”)

oShell = CreateObject("WScript.Shell")
oShell.Run("ISQL -q -i 'PRUEBA.SQL', 0, .T.")

Para que funcione, recuerda que debes tener a los archivos ISQL.EXE y FBCLIENT.DLL en la misma carpeta donde se encuentra tu aplicación o en el PATH de búsqueda.

Artículos relacionados:

Entendiendo a los scripts

Usando un script para insertar datos fijos

El índice del blog Firebird21

Anuncios

Usando ISQL.EXE para extraer los metadatos

1 comentario

Como seguramente sabes, en cada instalación de Firebird viene incluido un programa llamado ISQL.EXE (Interactive SQL) con el cual puedes realizar todas las operaciones posibles en una Base de Datos (crearla, conectarte a ella, agregarle dominios, tablas, índices triggers, stored procedures, insertar filas, modificar filas, borrar filas, etc., etc. etc.)

También podemos usar ese programa para extraer los metadatos y guardarlos en un archivo de texto plano ¿para qué necesitaríamos hacer algo así? por muchas razones, por ejemplo:

  • Verificar que todos los metadatos son los correctos
  • Verificar que no esté sobrando algún dominio
  • Cambiarle el nombre a una tabla

No es necesario usar ISQL.EXE para estas tareas, las mismas puedes también realizarlas con cualquier administrador gráfico como el EMS SQL Manager, el IBExpert, el Flame Robin, etc., pero la ventaja de hacerlas con ISQL.EXE es que este programa está siempre disponible, siempre lo tenemos a nuestra disposición, en cambio podría darse el caso que no contemos con los otros programas.

Enviar los metadatos a un archivo de texto plano tiene la gran ventaja de que muy rápidamente podemos encontrar la información que necesitamos, por ejemplo:

  • ¿Hay algún índice descendente?
  • ¿Hay alguna tabla sin Primary Key?
  • ¿Los nombres de todas las tablas son los correctos?
  • ¿Todas las tablas hijas tienen Foreign Keys a sus tablas padres?
  • ¿Hay algún dominio que no se esté usando?
  • ¿Todas las tablas que deberían tener columnas calculadas, tienen columnas calculadas?
  • Y un largo etcétera

¿Cómo enviamos los metadatos a un archivo de texto usando ISQL.EXE?

  1. Abriendo la ventanita “Símbolo del sistema” del Windows
  2. Ubicándonos en la carpeta donde se encuentra el programa ISQL.EXE
  3. Escribiendo: ISQL -extract MiBaseDatos > MiArchivoTexto

Donde “MiBaseDatos” puede ser la ruta y el nombre completos de la Base de Datos o simplemente un alias que hayamos especificado en el archivo ALIASES.CONF

ISQL1

Captura 1. Si haces clic en la imagen la verás más grande

En este ejemplo, el alias de la Base de Datos es ERP2000 (se lo definió en el archivo ALIASES.CONF) y el nombre del archivo de texto es ERP2000.SQL (el nombre y la extensión pueden ser cualesquiera, en el caso de la extensión la que más se usa es .SQL) y el símbolo “mayor que” es el utilizado por el DOS para redirigir la salida a un archivo.

Luego de unos segundos, cuando el programa ISQL.EXE finalice su tarea tendremos un archivo de texto llamado ERP2000.SQL conteniendo los metadatos de ERP2000.FDB

Podemos ver el contenido de ese archivo de texto con cualquier programa que permita leer archivos de texto, por ejemplo con el Bloc de Notas del Windows.

ISQL2

Captura 2. Si haces clic en la imagen la verás más grande

En la Captura 2 puedes ver los primeros metadatos.

Ahora, ya es muy fácil revisar el archivo de texto y encontrar cualquier inconsistencia que tenga la Base de Datos.

Artículo relacionado:

El índice del blog Firebird21

 

Verificando que SET TRANSACTION no inicia una transacción

1 comentario

En algunos documentos había leído que SET TRANSACTION iniciaba una transacción y en otros que no la iniciaba. Yo tenía entendido que no la iniciaba, pero me quedó la duda, así que decidí comprobar quien tenía razón. ¿SET TRANSACTION inicia una transacción o no la inicia?

Después de conectarme a la Base de Datos con ISQL escribí un SELECT que me muestra datos de todas las transacciones activas, como puedes ver en la Captura 1.

TRANSACCIONES2

Captura 1. Si haces clic en la imagen la verás más grande

El SELECT me muestra que hay dos transacciones activas, lo cual es lo correcto. Una de ellas es interna del ISQL y la otra es donde los usuarios escriben sus comandos.

TRANSACCIONES3

Captura 2. Si haces clic en la imagen la verás más grande

Escribí un ROLLBACK para finalizar la transacción actual del usuario.

TRANSACCIONES4

Captura 3. Si haces clic en la imagen la verás más grande

Después escribí un SET TRANSACTION que me servirá para poder verificar a que hora se inició la transacción.

TRANSACCIONES5

Captura 4. Si haces clic en la imagen la verás más grande

Y a continuación escribí otro SELECT, para ver los datos de las transacciones activas. Como muestra la Captura 4 hay dos transacciones activas: la interna del ISQL y la del usuario. La del usuario corresponde al momento en que se hizo el SELECT o sea que la transacción se inició con el SELECT, no con el SET TRANSACTION. Si se hubiera iniciado con el SET TRANSACTION entonces ambas transacciones hubieran tenido 23:38 en la columna MON$TIMESTAMP, pero no es así. La transacción interna del ISQL sí inició a las 23:38 pero la transacción del usuario inició a las 23:42 que es el momento en que se escribió el SELECT.

En otras palabras, está comprobado que el SET TRANSACTION no inicia la transacción sino que sirve para establecer los parámetros que serán utilizados por la siguiente transacción. La transacción la inicia el Cliente del Firebird cuando no hay una transacción activa y se ejecuta un comando (INSERT, UPDATE, DELETE, SELECT, EXECUTE PROCEDURE, etc.)

Artículos relacionados:

Entendiendo a las transacciones

El índice del blog Firebird21

Evitando que los mirones averigüen nuestro password en ISQL

1 comentario

Cuando nos conectamos a ISQL todo lo que escribimos es visible para cualquier mirón que esté parado detrás nuestro.

Por ejemplo, si escribimos:

MIRONES1

(si haces clic en la imagen la verás más grande)

Cualquiera que esté a nuestro costado o atrás nuestro mirando nuestro monitor sabrá que nos conectamos a la Base de Datos con nombre de usuario SYSDBA y con password 12345678

Si eso ocurre mientras estamos en la oficina de nuestro cliente después que terminamos nuestra tarea, nos vamos a nuestra propia oficina …. y el mirón aprovecha para conectarse a la Base de Datos como SYSDBA ya que conoce el password de ese usuario.

Eso, es un gran riesgo de seguridad. Nunca faltan por ahí los que quieren hacerse de los hackers y estarán más que felices de entrar en un lugar donde se supone no deberían entrar.

Pero necesitamos usar ISQL para realizar nuestra tarea, y tampoco podemos ser tan desagradables como para decirles que se vayan lejos, que se manden a mudar, que se alejen de nosotros porque vamos a escribir algo que queremos mantener en secreto ¿qué hacemos entonces, cómo podemos solucionar este problema, cómo podemos evitar que conozcan el password de SYSDBA o del usuario que usamos para conectarnos?

Afortunadamente el programa ISQL cuenta con una opción -fetch (extraer) la cual nos permite tener guardado el password en un archivo de texto y usará ese password en la conexión.

Por lo tanto lo que debemos hacer es:

  1. En un archivo de texto (que puede tener cualquier nombre) escribir el password
  2. Al ejecutar el programa ISQL escribir -fetch NombreArchivoTexto
  3. De este modo, para conectarnos a la Base de Datos no deberemos especificar el password
  4. Si no le mostramos a los usuarios el contenido de nuestro archivo de texto jamás sabrán cual es nuestro password

MIRONES2

(si haces clic en la imagen la verás más grande)

En este ejemplo, el password del usuario SYSDBA está guardado en un archivo de texto llamado E:\SISTEMAS\PASS.TXT

Pero ¿cuál es ese password? Ningún mirón puede saberlo, ya que lo que él verá será la captura de pantalla que está arriba.

Nuestro archivo de texto E:\SISTEMAS\PASS.TXT puede estar en un pen-drive y de esa manera ningún mirón jamás tendrá la menor idea de cual es el password allí guardado.

Haciendo así nos aseguramos que ningún mirón se entere de nuestro password y además lo hacemos de una forma “políticamente correcta”, es decir sin necesidad de ser desagradables con otras personas.

Artículo relacionado:

El índice del blog Firebird21