Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PARTE 1: Cliente/Servidor.................................. 5
Servidores de archivos compartidos y Cliente/Servidor... 5
Sistemas Cliente/Servidor............................... 5
Como funciona Cliente/Servidor.......................... 6
¿Cuales son las ventajas de usar Cliente/Servidor?...... 6
Como mostrar los datos al usuario....................... 7
Manera eficiente de enviar/recibir datos del Servidor... 7
Claves primarias........................................ 9
Relaciones.............................................. 9
Concurrencia............................................ 9
Transacciones........................................... 10
Diferencia de terminología.............................. 10
PARTE 2: Firebird.......................................... 11
¿Qué es Firebird?....................................... 11
Tipos de Servidor....................................... 11
Recursos utilizados..................................... 11
Plataformas y versiones para el Servidor................ 12
Plataformas y versiones para el Cliente................. 12
Características principales de Firebird................. 12
Conectividad............................................ 13
Herramientas............................................ 14
Instalando el Servidor.................................. 14
Instalando el Cliente................................... 14
Instalando el driver ODBC............................... 15
Verificando la instalación.............................. 15
El archivo HOST......................................... 16
El archivo ALIASES.CONF................................. 16
El archivo FIREBIRD.CONF................................ 17
El archivo SECURITY2.FDB................................ 17
Como evitar la corrupción de las Bases de Datos......... 17
Como corromper una Base de Datos........................ 17
Dialectos SQL (SQL dialect)............................. 18
Tamaño de la página (page size)......................... 18
Conjunto de caracteres (character set).................. 18
Scripts................................................. 19
El usuario SYSDBA....................................... 20
Agregando nuevos usuarios........................... 21
Borrando usuarios................................... 21
Listando todos los usuarios......................... 21
Cambiando la contraseña de un usuario............... 22
Nombres de los usuarios............................. 22
Contraseñas (passwords) de los usuarios............. 22
Como proteger las Bases de Datos........................ 22
-1-
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
-2-
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Conclusión................................................. 58
-3-
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Introducción
¿Por qué usar Firebird con Visual FoxPro? ¿Por qué Firebird gusta tanto?
Firebird es un motor de bases de datos SQL muy liviano, muy poderoso, muy fácil
de usar y totalmente gratis tanto para uso privado como comercial. Y se lo puede
integrar perfectamente con Visual Foxpro.
Por lo tanto, es muy lógico que estos dos colosos trabajen juntos. Sin embargo, hasta
este momento no había literatura al respecto, quienes usaron Visual Foxpro con Firebird
están más que conformes con el rendimiento obtenido pero todo lo tuvieron que
aprender desde cero. Cuando finalices de leer este documento te habrás ahorrado un
montón de tiempo.
-4-
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Parte 1. Cliente/Servidor
Sistemas Cliente/Servidor
Un sistema Cliente/Servidor (tal como Firebird) está compuesto por dos
módulos de software diseñados para comunicarse entre sí usando el mismo protocolo de
comunicación. El Cliente envía mensajes al Servidor pidiéndole algo y éste responde al
pedido. Inclusive pueden estar en distintos Sistemas Operativos, por ejemplo el Servidor
en una computadora con Linux y el Cliente en una computadora con Windows. El
protocolo recomendado para usar con Firebird es TCP/IP.
-5-
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Este es un concepto que se debe entender muy bien: los datos que recibe el
Cliente (y que luego envía a la aplicación) son una copia de los datos del Servidor.
En cambio en un sistema de archivos compartidos (el utilizado por las tablas .DBF)
son los datos originales, no una copia, los que utilizan las aplicaciones.
En Firebird:
-6-
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Un ejemplo: una aplicación envía una petición de consulta al Servidor para que
devuelva un cursor (un cursor es una tabla temporal) con las ventas realizadas entre dos
fechas. En el Servidor se descubre que una de las fechas estaba vacía. Eso es un error de
concepto. ¿Por qué? porque esa verificación pudo haberse realizado en la aplicación, la
petición de consulta viajó por la red y el mensaje de error también. O sea, hubo un
tráfico innecesario en la red, lo cual la hace más lenta. Cuando de devolver datos se
trata, al Servidor deben llegar siempre los datos totalmente validados, allí no debe
validarse nada, todas las validaciones deben realizarse antes.
-7-
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Por supuesto que si hay que imprimir un informe con los datos de todos los
proveedores entonces los datos de todos los proveedores viajarán por la red. Pero si
solamente se necesitan los datos de algunos proveedores, solamente los datos de ellos
deben viajar por la red.
Siempre hay que tener presente lo siguiente: el tráfico en la red debe ser el
mínimo posible. Por lo tanto traer todos los datos es, en general, un error de concepto.
Mostrará todos los datos de todos los países. Si realmente se desea ver todos los
datos de todos los países (códigos, nombres, capitales, población, forma de gobierno,
idioma oficial, moneda, etc.) entonce es correcta. Pero si solamente se desean ver
algunos datos (códigos y nombres, por ejemplo) es errónea porque se está haciendo
viajar por la red datos que no se utilizarán.
-8-
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Para quienes están acostumbrados a usar tablas .DBF esto puede resultar difícil
al principio, ya que allí lo normal es que los registros se lean completamente. Cuando se
accede a un registro se tiene acceso a todos sus campos. Por ejemplo:
USE Paises
SET ORDER TO TAG Codigo
SEEK “595” && Busca el país que tiene código “595”
? Codigo, Nombre, Capital, Poblacion, FormaGob, Idioma, Moneda
O sea, que por la red solamente viajaron el Código y el Nombre de ese país,
nada más. Al no viajar la Capital, Población, etc., todo es más rápido.
Claves primarias
Cada tabla debe tener sí o sí una clave que identifique a cada fila (registro) de
manera inequívoca (o sea que no puede faltar ni estar duplicada). A esa clave se la llama
Clave Primaria (PK = Primary Key). Lo mejor para estos casos es que esa clave la
genere el propio Firebird ¿Por qué preocuparte en generar una clave única si el Firebird
puede realizar ese trabajo por ti? No es lógico.
Para que una columna (campo) pueda ser utilizada como clave primaria, no debe
aceptar valores nulos.
Relaciones
Para relacionar una tabla con otra se utilizan las claves foráneas o extranjeras
(FK = Foreign Key). Ese relacionamiento es persistente, o sea que estará en vigencia
sea cual sea la aplicación que utilice a esa Base de datos.
Concurrencia
En una aplicación multi-usuario puede ocurrir que dos o más de ellos quieran
leer o modificar la misma fila (registro) al mismo tiempo. Eso puede causar problemas a
veces graves. Pero no es el caso con Firebird ya que éste provee un mecanismo por el
cual “los lectores no molestan a los escritores y los escritores no molestan a los
lectores”.
-9-
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Transacciones
Esto puede ser un poco difícil de entender al principio ya que cuando se usan
tablas .DBF los datos quedan grabados después que el usuario hizo click sobre el botón
“Grabar” y la luz del disco duro se apagó. En cambio en Firebird todas las
comunicaciones entre el Cliente y el Servidor ocurren durante transacciones. Inclusive
leer una fila (registro) de una tabla no se puede realizar si antes no se inició una
transacción. Una transacción empieza cuando el Cliente la inicia (a pedido de la
aplicación), a partir de ese momento y hasta que finaliza (también por pedido de la
aplicación al Cliente) puede realizar pedidos al Servidor.
Diferencia de terminología
En las bases de datos relacionales (como Firebird) se le llama “fila” a lo que en
Visual FoxPro estamos acostumbrados a llamar “registro”. Y se le llama “columna” a lo
que le solemos llamar “campo”. Recuerda eso.
- 10 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Parte 2. Firebird
¿Qué es Firebird?
Es un motor de bases de datos relacionales SQL. Es Open Source (código
abierto) y es totalmente gratis, tanto para uso privado como para uso comercial. Tiene
todas las características y la potencia de un RDBMS (Relational DataBase Management
System o Sistema Administrador de Bases de Datos Relacionales). Puede manejar bases
de datos desde unos pocos Kilobytes hasta muchos Terabytes con muy buen
rendimiento y casi sin mantenimiento.
Tipos de Servidor
Firebird tiene cuatro tipos de Servidor (Classic, SuperServer, SuperClassic,
Embedded), cualquiera de ellos se puede utilizar y sea cual sea el utilizado las Bases de
Datos no cambian. Por lo tanto se puede pasar muy fácilmente de uno a otro. El
recomendado para usar en Windows es el llamado SuperServer y por lo tanto las
siguientes referencias serán a ese. Sin embargo, si la computadora tiene varios
procesadores entonces Classic o SuperClassic serían los preferibles. Para aplicaciones
monousuario o para catálogos en CD o programas similares se puede usar Embedded,
ya que no necesita instalación, incluye el Servidor y el Cliente en un solo archivo .DLL
Recursos utilizados
Una de las ventajas de Firebird es que utiliza muy pocos recursos. Inclusive
puede instalarse en las obsoletas computadoras 486 DX con Windows 95 o con Linux.
Desde luego que no es realista usar esas computadoras en esta época, pero sí es posible.
Por supuesto que cuanto más poderosa sea la computadora será mucho mejor para
todos. El Servidor de Firebird utiliza 2 Mb de memoria y a eso hay que agregarle unos
115 Kb por cada conexión a la Base de Datos. Una regla mnemónica fácil es la
siguiente: 2 Mb + 1 Mb cada 8 conexiones.
En esta época casi cualquier computadora tiene por lo menos 1024 Mb, así que
pueden realizarse muchísimas conexiones sin ningún problema.
- 11 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Pasar de una plataforma a otra no puede ser más fácil. Se hace un backup de la
Base de Datos en una plataforma y se lo restaura en la otra plataforma.
- 12 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Conectividad
Firebird acepta los siguientes métodos: ODBC, JDBC (JayBird), PHP driver,
Perl, Python, OLEDB driver, dbExpress, proveedores de datos .Net, paquetes de
componentes nativos para C/C++/Delphi, llamadas directas a la API.
Para usarlo desde Visual FoxPro el primero de ellos (ODBC) da excelentes resultados.
- 13 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Herramientas
Hay muchos programas que pueden usarse con Firebird, incluyendo
administradores gráficos, replicadores, auditorías, generadores de datos, analizadores de
estadísticas del Servidor, etc.
Instalando el Servidor
Hay que elegir cual tipo de Servidor se desea. Lo aconsejable es instalarlo como
un servicio del Windows, para que se inicie junto con el Windows. El mismo programa
que se utiliza para instalar el Servidor se usará para instalar al Cliente. Siempre es
aconsejable instalar la última versión estable. Se lo puede descargar de:
http://www.firebirdsql.org/index.php?op=files&id=engine
Instalando el Cliente
Aunque se lo puede instalar manualmente, lo mejor es hacerlo mediante el
programa de instalación.
- 14 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
http://www.firebirdsql.org/index.php?op=files&id=odbc
Verificando la instalación
Verificando la conexión a la computadora donde se encuentra el Servidor
- 15 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
El archivo HOST
Una manera de ocultar la dirección IP del Servidor es mediante el uso del
archivo HOST. Este es un archivo que se encuentra en la carpeta C:\WINDOWS\ y que
sirve para darle un nombre a las direcciones IP. Luego, cuando sea necesario, se puede
usar el nombre y no la dirección IP.
Ejemplos:
El archivo ALIASES.CONF
Este es un archivo que se encuentra en la carpeta raíz del Firebird y no debe ser
movido de allí.
Permite darle un nombre abreviado a las bases de datos y usar ese nombre
abreviado en las conexiones. Eso aumenta la seguridad, ya que los curiosos no pueden
saber en que carpeta se encuentra la Base de Datos ni cual es el nombre de ella.
Ejemplo:
Conta = C:\SISTEMAS\SQL_CONTA\CONTA.FDB
Conexión:
10.12.13.2:C:\SISTEMAS\SQL_CONTA\CONTA.FDB
o:
10.12.13.2:Conta
o:
MiServidor:Conta
- 16 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
El archivo FIREBIRD.CONF
Este es un archivo que permite configurar al Firebird, se encuentra en su carpeta
raíz y sus valores pueden ser cambiados, de acuerdo a la necesidad.
En general, los valores que tiene son los más adecuados para la mayoría de las
situaciones, pero si no es así, cambiarlos es muy fácil. Se lo abre con cualquier editor de
texto plano (el NOTEPAD, por ejemplo) se cambia lo que se desea y se lo graba.
El archivo SECURITY2.FDB
Este es el archivo donde el Firebird guarda los datos de cada usuario (nombres y
contraseñas), está localizado en la misma carpeta del Firebird y no debe ser movido de
allí.
• Modificar las tablas de los metadatos. Estas son las tablas internas que el
Firebird crea dentro de cada Base de Datos. No las toques. Te lo repito: no las
toques.
• Deshabilitar “Forced Writes”. Por defecto, el Firebird graba los datos en el
disco apenas se hace el commit de ellos. No cambies esa configuración.
• Restaurando un backup en una Base de Datos que se está ejecutando. Si los
usuarios están usando una Base de Datos, no debes restaurar sobre ella.
• Permitir a los usuarios que se conecten durante una restauración. Mientras
se está restaurando una Base de Datos, nadie debe estar conectado.
- 17 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Hay muchos más, pero con estos ya tienes la idea. Lo importante a recordar es
que para los idiomas latinos (el castellano entre ellos) debes elegir: ISO8859_1
- 18 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Scripts
Además de crear las Bases de Datos, Dominios, Tablas, Índices, etc.
manualmente, también se tiene la posibilidad de hacer esas tareas automáticamente a
través de un script.
Ejemplo:
CREATE TABLE Paises (
Codigo SmallInt NOT NULL,
Nombre VarChar(25) NOT NULL,
Capital VarChar(25),
Poblacion BigInt,
Los scripts a menudo se utilizan cuando se instala una nueva aplicación (Ventas,
Facturación, Contabilidad, Sueldos, etc.) en lo de un cliente. No hace falta copiar una
Base de Datos vacía en su computadora, con copiar y ejecutar los scripts es más que
suficiente, se ahorra mucho espacio en disco, pero además los scripts cumplen con otra
tarea que es muy importante: documentación.
Mirando los scripts se puede conocer las características y las estructuras de una
Base de Datos y de cada uno de sus componentes (Dominios, Tablas, Índices, etc.)
Por ejemplo:
CREATE TABLE Usuarios (
Nombre VarChar(20), /* este es el nombre del usuario, si es necesario este
comentario puede ocupar varias líneas */
Contrasena VarChar(12) -- esta es la contraseña del usuario, sólo en una línea
);
- 19 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
El usuario SYSDBA
En Firebird hay un usuario que tiene todos los derechos, puede hacer todo lo que
quiera con cualquier Base de Datos. El nombre de ese usuario es SYSDBA. Cuando se
instala el Firebird la contraseña de ese usuario es masterkey (en realidad, masterke,
solamente se consideran los primeros ocho caracteres).
Lo primero que debes hacer apenas has instalado el módulo Servidor del
Firebird es cambiar esa contraseña ¿por qué? porque la contraseña masterkey la conocen
todos en todo el mundo y si tu computadora está conectada a Internet y llega a ser
hackeada o si dentro de tu organización hay un enemigo interno, será la primera
contraseña que probarán.
Para cambiar la contraseña del usuario SYSDBA debes abrir una ventana de
comandos, ingresar a la carpeta \BIN del Firebird y ejecutar el programa GSEC.EXE,
como se ve en la siguiente pantalla:
Recuérdalo muy bien porque este es un concepto muy importante: las tareas
diarias no debe hacerlas el usuario SYSDBA.
- 20 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Aquí se agregaron tres nuevos usuarios. Walter, con contraseña 123456, Silvia,
con contraseña hermosa y Erika con contraseña japonesa.
Borrando usuarios
El usuario SYSDBA también puede borrar usuarios, como se ve en la siguiente
pantalla:
Para ver los nombres de todos los usuarios se utiliza el comando display.
- 21 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
- 22 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
El comando que se usa para otorgar privilegios a los usuarios se llama GRANT.
Su sintaxis es la siguiente:
Privilegios
Los privilegios que pueden ser otorgados a los usuarios (y revocados) son los
siguientes:
Ejemplos:
GRANT SELECT, UPDATE, INSERT, DELETE ON PRODUCTOS TO SILVIA;
- 23 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Roles
Los roles permiten agrupar a los usuarios para que todos quienes compartan un
rol tengan los mismos privilegios. Todos los usuarios que tienen el mismo rol disponen
de exactamente los mismos derechos. Un usuario puede tener varios roles pero
solamente uno de ellos estará activo en cada momento.
Por ejemplo, se puede tener un rol para Ventas, otro para Contabilidad, otro para
Recursos Humanos, etc. Si se crea un rol llamado “Ventas” que solamente permite ver
cantidades en stock, precios de venta y realizar ventas, los usuarios que usen ese rol no
podrán ver los Balances ni los datos de los empleados.
Los roles son específicos de cada Base de Datos, un rol creado para una Base de
Datos no funcionará en otra.
Creando un rol
Eliminando un rol
Ejemplos:
/* Se crea el rol R_PRODUCTOS, que tiene todos los privilegios sobre la tabla PRODUCTOS y se le asigna a Silvia */
/* Se crea el rol R_VENDEDORES, que solamente puede consultar la tabla VENDEDORES (o sea que no puede insertar
ni borrar ni modificar datos) y se le asigna a Silvia */
- 24 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Crear un dominio
CREATE DOMAIN NumeroEntero INTEGER;
CREATE DOMAIN NombrePersona VARCHAR(30);
- 25 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
- 26 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Agrupar filas
SELECT Codigo, Apellidos, Nombres FROM Personas GROUP BY Apellidos, Nombres, Codigo;
todas las columnas que están antes del GROUP BY deben estar también después, aunque pueden estar en distinto orden
- 27 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
El programa ISQL.EXE
Interactive SQL es un programa de línea de comandos que incorpora
herramientas y técnicas para mantener objetos de las bases de datos, administrar
transacciones, procesar scripts.
La ventaja que tiene es que existe en todas las instalaciones del Servidor de
Firebird, la desventaja es que hay que escribir los comandos. Como hay muchos
programas que permiten realizar esas tareas gráficamente, en general no se lo usa, pero
siempre es bueno conocerlo, alguna vez puede ser de utilidad. Por eso es recomendable
que practiques un poco con él, para saber usarlo cuando lo necesites.
Con ISQL se pueden crear bases de datos, dominios, tablas, índices, y en general
realizar todas las operaciones usuales.
- 28 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
En la imagen de arriba se ven todas las filas y las columnas country y currency
de la tabla COUNTRY.
El programa GBAK.EXE
Es un programa utilitario que se encuentra en la carpeta \BIN del Firebird, su
misión es realizar copias de seguridad (backups) de las bases de datos y restaurarlas
cuando sea necesario. También detecta corrupción de datos, libera el espacio en disco
ocupado por las filas borradas (un equivalente al comando PACK del VFP), resuelve las
transacciones que no estaban completas, permite partir una Base de Datos en varios
archivos (muy útil cuando ya es demasiado grande), también se lo usa para restaurar el
backup en otra plataforma (de Windows a Linux, por ejemplo).
- 29 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Ejemplo 1:
Aquí el usuario SYSDBA cuya contraseña es secreto hizo un backup del archivo
AGENDA.FDB. El nombre del archivo generado es AGENDA27112010.
Ejemplo 2:
El programa NBACKUP.EXE
Este programa ofrece posibilidades que no tiene GBAK.EXE pero no lo
reemplaza, sino que lo complementa.
Puede bloquear la base de datos para que el backup se haga con otro programa.
En este caso no realiza el backup sino que establece las condiciones para que pueda ser
realizado.
- 30 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Ambos modos pueden hacerse sobre una Base de Datos activa, sin molestar a los
usuarios. El backup realizado siempre reflejará el estado al principio de la operación.
- 31 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
http://www.sqlmanager.net/en/products/ibfb/manager/download
Hay varias opciones, si se desea descargar una que es gratis elegir la que dice
“freeware”.
- 32 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Una vez que la Base de Datos esté registrada, se verá una pantalla, similar a la
siguiente:
Haciendo doble click sobre EMPLOYEE se verán todos sus componentes, como
a continuación se muestra:
- 33 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
- 34 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
si una columna (por ejemplo: salario) tiene ese dominio, el Firebird no permitirá
que se grabe una fila si el valor de la columna salario es cero o menor que cero ¿Por qué
no? porque antes de realizar la grabación verifica que el valor sea mayor que cero
(CHECK (VALUE > 0))
- 35 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
- 36 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
SET TERM ; ^
- 37 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
SET TERM ^ ;
SET TERM ; ^
En Visual FoxPro tienes muchas funciones que raramente usas, por ejemplo
SIN() (seno), COS (coseno), TAN() (tangente), ASIN(), (arco seno), etc. las cuales
siempre están dentro de tus ejecutables y los hacen más grandes de lo necesario. El
- 38 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Firebird es más económico, también puedes usar esas funciones si las necesitas, pero si
no las necesitas, no están ocupando espacio.
Las funciones UDFs son globales a la Base de Datos, eso significa que una vez
declaradas las puedes utilizar en cualquier procedimiento almacenado o en cualquier
desencadenante.
Antes de usar una función hay que declararla, o sea decirle al Firebird que
deseas usar esa función en la Base de Datos abierta. Para ello se utiliza el comando
DECLARE EXTERNAL FUNCTION.
Ejemplo:
DECLARE EXTERNAL FUNCTION abs
DOUBLE PRECISION
RETURNS DOUBLE PRECISION BY VALUE
ENTRY POINT ‘IB_UDF_abs’ MODULE NAME ‘ib_udf’;
Una tabla puede tener todos los desencadenantes que se desee, el orden de
ejecución de ellos depende del valor de la variable POSITION.
New se refiere al nuevo valor que tendrá la columna, old se refiere al valor
anterior.
- 39 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
SET TERM ^ ;
SET TERM ; ^
SET TERM ; ^
- 40 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
el cual le dice al Firebird que los números de empleado deben empezar con 145.
SET TERM ^ ;
SET TERM ; ^
create procedure p1
as
begin
finsert into t1 values(10);
end;
El nuevo terminador puede ser cualquiera, con una condición: no debe estar
dentro del bloque de código que estás escribiendo (podrías usar la letra A pero tendrías
problema si dentro del bloque aparece una letra A). El terminador alternativo más
utilizado, el que está prácticamente estandarizado en Firebird es el ^
- 41 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Integridad Referencial
La “integridad referencial” es la capacidad de una Base de Datos de protegerse a
sí misma evitando recibir valores de entrada que puedan dañar a las relaciones.
Específicamente se trata de proteger las relaciones entre dos tablas.
Una foreign key (abreviada FK) es una columna o conjunto de columnas de una
tabla que corresponde en orden exacto a una columna o conjunto de columnas de otra
tabla definida/s como primary key (abreviada PK) o como unique.
Si se implementa este modelo como dos tablas PADRE e HIJO, entonces las
filas en la tabla HIJO dependen de la existencia de una fila en la tabla PADRE.
- 42 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Trabajando con las tablas .DBF del Visual FoxPro se pueden grabar registros en
VENTASDET aunque el campo Código del Producto se deje en blanco o aunque se
escriba un código inexistente. Algo así es imposible en Firebird, no se puede hacer eso,
aunque se quiera. Por lo tanto, aumenta en gran medida la seguridad y la confianza en
los datos grabados.
En Visual FoxPro:
- Aunque no exista un producto con ese Código igual se puede grabar un registro
en VENTASDET
- Aunque se deje en blanco el campo Código del Producto, igual se puede grabar
un registro en VENTASDET
- Se puede borrar un registro de la tabla PRODUCTOS aunque el código de ese
registro se esté utilizando en la tabla VENTASDET
- Se puede cambiar el código de un producto aunque ese código se esté utilizando
en la tabla VENTASDET
O sea, es más fácil “meter la pata” (hacer algo malo o incorrecto) en Visual FoxPro.
Solamente por esta característica ya deberías pensar seriamente en usar tablas Firebird.
No action
Es el valor por defecto, por lo tanto puede ser (y generalmente es) omitido. Su
acción es impedir que la PK pueda ser borrada o modificada.
On Delete Cascade
Cuando se borra una fila de la tabla PADRE las filas relacionadas en la tabla
HIJO también son borradas.
On Update Cascade
Cuando se modifica un código en la tabla PADRE los códigos relacionados de la
tabla HIJO son también modificados para que todos tengan el mismo valor.
Set Null
Cuando se borra o modifica un código de la tabla PADRE los códigos
relacionados de la tabla HIJO son puestos a null, por lo tanto esas filas quedan
huérfanas. Generalmente esta acción no es recomendada ya que se pierde la ventaja de
la integridad referencial. Naturalmente esta acción no puede realizarse si la columna
código de la tabla HIJO no admite valores nulos.
- 43 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Índices
Los índices son atributos de las tablas que pueden ser localizados sobre una
columna o conjunto de columnas para acelerar la recuperación de filas.
Límites
Firebird admite hasta 256 índices por tabla.
Cada índice puede tener hasta 253 bytes.
Índices automáticos
Las restricciones PK y FK automáticamente crean sus propios índices. Cuando
crees tus índices es importantísimo no duplicar los índices que ya ha creado el Firebird
porque en ese caso el motor podría estar en la duda de cual usar (porque ambos son
idénticos) y podría decidir no usar ninguno de ellos (haciendo tus búsquedas mucho más
lentas).
Cuando indexar
Cada índice ocupa espacio en disco, además los índices deben ser actualizados
cuando se agregan, borran o modifican las filas, consumiendo tiempo, a veces mucho.
Por lo tanto aunque pueden ser de gran ayuda es importante crear solamente los que
sean necesarios y ninguno más. Una buena práctica es la siguiente:
• Creas tus tablas sin índices y los vas agregando a medida que los necesitas
• Crea índices sobre columnas cuyo valores son frecuentemente buscados
• Crea índices sobre columnas que frecuentemente aparecen en JOINs
• Crea índices sobre columnas que frecuentemente aparecen en los primeros
lugares de GROUP BY
• No crees índices sobre columnas que tienen muchos valores repetidos
• No crees índices sobre columnas que se usarán muy raras veces
• No crees índices sobre columnas que tienen muchos valores que nunca son
buscados, como horas y minutos
• No crees índices sobre columnas que se buscan con LIKE
- 44 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Transacciones
Recuerda que en Firebird las aplicaciones nunca tocan los datos que están
almacenados en una Base de Datos. En lugar de eso, las aplicaciones realizan
“conversaciones” con el Servidor a través de los pedidos que hacen y las respuestas que
reciben. Una conversación completa entre un cliente y el Servidor se llama transacción.
Actualizaciones perdidas
Esto ocurre cuando dos usuarios están viendo los mismos datos. El primero de
ellos realiza algunos cambios, poco después el segundo realiza otros cambios. Por lo
tanto se pierden los cambios que había hecho el primero.
Lecturas sucias
Esto le permite a un usuario ver los cambios que otro usuario está haciendo, pero
sin tener la garantía de que esos cambios sean finales.
Lecturas no reproducibles
Ocurren cuando un usuario está seleccionando filas continuamente mientras
otros usuarios están modificando y borrando esas filas. Esto puede ser un problema o
no, depende de las circunstancias.
Filas fantasmas
Ocurre cuando un usuario puede seleccionar algunas, pero no todas, las filas
insertadas por otro usuario. Nuevamente, esto puede ser un problema o no, dependiendo
de las circunstancias.
Transacciones intercaladas
Ocurren cuando cambios en una fila por un usuario afectan a otras filas de esa
misma tabla o de otras tablas que están siendo accedidas por otros usuarios. Esto suele
suceder cuando no hay forma de controlar el orden en el cual se realizan los cambios.
Cada transacción tiene un contexto único que causa que esté aislada de todas las
demás transacciones. Las reglas para ese contexto son especificadas por la aplicación
cliente pasando parámetros de transacción.
- 45 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Transacciones y MGA
Grabación de datos
- 46 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Una sola transacción puede realizar muchas tareas: insertar registros en una o en
varias tablas, modificarlos, borrarlos. Si se descubre algún error en alguna de esas tareas
entonces todas esas inserciones, modificaciones y borrados pueden ser desechados
(mediante un roll back). Si todo está bien y solamente si todo está bien, entonces se los
graba permanentemente en el disco (con un commit).
¿Por qué se hace así? Porque de esa manera las bases de datos siempre tienen
datos consistentes, nunca falta o sobra algo. Por ejemplo si se tiene una tabla maestro y
una tabla detalles el programador puede estar seguro que la tabla detalles tiene todas las
filas y con todos los datos correctos, sin faltar nada.
Por lo tanto:
o El usuario que realizó un INSERT, UPDATE o DELETE está viendo los
cambios que esas operaciones implican
o Los demás usuarios no los ven
o Si el usuario graba en forma permanente (con un commit), los demás
usuarios también ven los cambios
o Si el usuario desecha los cambios (con un roll back), los demás usuarios
jamás se enteraron de ellos
Por ejemplo:
- El usuario Juan cambia el número de teléfono del proveedor “TodoFrutas S.A”
- El usuario Juan imprime los números de teléfono de todos los proveedores. El
nuevo número de teléfono de “TodoFrutas S.A.” aparece en ese informe
- El usuario María imprime los números de teléfono de todos los proveedores. El
viejo número de teléfono de “TodoFrutas S.A.” aparece en ese informe
- El usuario Juan graba en forma permanente los cambios (hace un commit)
- Los demás usuarios (María y los otros) recién ahora pueden ver el nuevo número
de teléfono del proveedor “TodoFrutas S.A.”
Datos desechados
El roll back nunca falla. Nunca. Este desecha todos los cambios que se
realizaron en la transacción, tanto el que causó el error como todos los demás que se
hubieran grabado exitosamente de no haber ocurrido el error.
Por ejemplo:
• Se inicia una transacción
• Se agrega un proveedor a la tabla de PROVEEDORES
• Se agrega una compra a la tabla COMPRASCAB
• Se agregan los datos de los productos comprados a la tabla COMPRASDET
• Se descubre un error
• Se realiza un roll back de los datos. Eso implica que:
o El proveedor que se había agregado a PROVEEDORES es eliminado
o La compra que se había agregado a COMPRASCAB es eliminada
- 47 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Como ya se vio anteriormente, las únicas formas de finalizar una transacción son
mediante un commit o mediante un roll back. Pero ¿qué ocurre si la aplicación se colgó
o hubo un corte de energía eléctrica? En ese caso la transacción continuará activa
porque el Servidor no finalizará una transacción a menos que se le pida que lo haga.
¿Y cuál es el problema? Que si múltiples versiones de una fila están en una tabla
o si hay transacciones muertas entonces se está ocupando innecesariamente espacio en
el disco duro y las búsquedas y las consultas son más lentas. Es decir: se degrada la
performance.
- 48 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Esa es la forma correcta cuando tanto el Servidor como el Cliente están en una
LAN. La conexión se realiza al principio de la aplicación (Contabilidad, Ventas,
Sueldos, etc.) y la desconexión al finalizar la aplicación.
Desde luego que esto es mucho más lento, porque el estar conectándose y
desconectándose toma un buen tiempo, pero a veces no hay otra alternativa.
¿Que es DSN?
Son las siglas de Data Source Name (Nombre de la Fuente de Datos) y sirve para
proveer conectividad a una Base de Datos a través de un driver ODBC.
La conexión también puede realizarse sin DSN. En este caso toda la información
necesaria para la conexión se escribe dentro de la aplicación. Si la conexión es sin DSN,
en lugar de utilizar un driver ODBC se puede usar OLE DB o algún otro método.
- 49 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
http://www.firebirdsql.org/index.php?op=files&id=odbc
Por supuesto que las Bases de Datos SQL se pueden usar sin necesidad de
objetos pero ya que se tiene esa posibilidad, ¿por qué no aprovecharla?. La POO tiene
muchas cosas buenas, entre ellas que permite que el código escrito sea reutilizable, que
todo se encuentre en un solo lugar haciendo más fácil buscar y modificar lo que se desee
y que los cambios se propagan a todos los objetos creados a partir de una clase.
- 50 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Estas son todas las variables internas (o propiedades) de la clase que se está
creando. Pero esas propiedades por sí solas no sirven para mucho, son más útiles
cuando se crean procedimientos o funciones que las manipulan.
- 51 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
En este caso hay que armar una “cadena de conexión” y usar la función
SQLStringConnect().
- 52 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Con la función SQLExec() se pueden ejecutar los comandos SQL (si existe una
conexión activa a una Base de Datos, desde luego). Pero ya que se está escribiendo una
clase, ¿por qué no crear una función propia que no solamente trate de ejecutar un
comando sino que también verifique antes si hay una conexión activa y en caso de no
haberla intente la conexión?
Function EJECUTAR
LParameters tcComando, tcNombreCursor
Local lnI
tcNombreCursor = iif(VarType(tcNombreCursor) <> "C", "", tcNombreCursor)
with This
.lcComando = tcComando
.lcNombreCursor = tcNombreCursor
lnI = 1
do while !.HayConexion() .and. lnI <= 30
.Conectar_sin_DSN()
if .lnResultado < 0
Wait window "No puedo conectarme al Servidor. Deberías verificar que la
red esté funcionando correctamente. Intento Nº " + Transform(lnI) TimeOut 2
endif
lnI = lnI + 1
enddo
if .lnHandle > 0 && Hay una conexión activa
.lnResultado = SQLExec(.lnHandle, .lcComando, .lcNombreCursor)
if .llTerminarConexion && Quiere terminar la conexión después de
ejecutar el comando, usualmente cuando se accede por Internet
.Desconectar()
endif
else
.lnResultado = -1
endif
endwith
Return(This.lnResultado >= 1)
*
*
- 53 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Antes de enviar un comando SQL es conveniente verificar que hay una conexión
activa a la Base de Datos. Porque si no la hay, ocurrirá un error, eso es seguro.
Function HAYCONEXION
Local llResultado
Try
llResultado = SQLExec(This.lnHandle, "SELECT CURRENT_TIME FROM
RDB$DATABASE")
Catch
llResultado = -1
EndTry
Return(llResultado == 1)
*
*
http://www.mediafire.com/?64vd8se54g91eob
http://www.mediafire.com/?qqsh1q2z3e6kmnq
Eso es distinto que cuando se trabaja con tablas .DBF. En este caso, si modificas
los campos que ves en el BROWSE, esos cambios quedan grabados en la tabla. En
cambio, cuando usas tablas SQL, los cambios que haces en un BROWSE no se graban
en la tabla original. Si quieres grabar algo en una tabla SQL debes enviar
específicamente una instrucción INSERT o UPDATE.
- 54 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Por supuesto que usar ISQL no suele ser la mejor alternativa, y en su lugar se
puede usar Flame Robin, SQL Manager o inclusive el BROWSE del Visual FoxPro
pero la gran ventaja que se tiene con ISQL es que está siempre disponible en todas las
instalaciones del Firebird.
Otra ventaja es que si el SELECT que has escrito en tu programa Visual FoxPro
no te funciona y no sabes el motivo entonces al escribirlo dentro del ISQL obtendrás
información que te resultará de utilidad para saber qué estás haciendo mal. Por ejemplo:
- 55 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Aunque a veces parecen ser la misma cosa, agrupar es distinto que ordenar, para
agrupar (poner a las filas en grupos) se usa GROUP BY, para ordenarlas se usa ORDER
BY, para ordenarlas en forma descendente hay que agregar DESCENDING.
Un pequeño negocio ha pedido que se le haga una aplicación para ayudarle con
el control del mismo. Ellos se dedican a vender bebidas, es lo único que venden y no
tienen previsto vender algo más. En su lista hay cervezas, vinos, whiskies, gaseosas,
aguas minerales, pero su fuerte son las bebidas alcohólicas, en especial las cervezas. El
negocio abre los 7 días de la semana, inclusive cuando hay partidos de fútbol
importantes o algún otro acontecimiento los días Domingo tienen una venta muy
grande. No tienen sucursales ni planean tenerlas. En ese negocio trabajan dos personas:
el propietario y un empleado, quienes se van turnando los horarios. Al empleado
además de un sueldo fijo se le paga una comisión del 3% sobre las ventas realizadas.
Todas las compras y todas las ventas son al contado, a nadie se le vende a crédito, por
ningún motivo. Los clientes no pueden retirar la mercadería antes de pagarla. Las ventas
pueden ser al por mayor o al por menor (o detalle), los precios de venta son distintos
para ambos casos. Pueden vender por unidades o por cajas (o packs), las cajas (o packs)
pueden contener: 3, 6, 12, 24 unidades. Nunca devuelven productos a los proveedores ni
aceptan devoluciones de los clientes.
- 56 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Para crear la Base de Datos, los dominios, tablas y vistas se utilizaron scripts, de
tal manera que sea muy fácil reconstruirla en caso de necesidad.
Por convención los scripts tienen la extensión .SQL pero no es obligatorio, a tus
scripts puedes ponerles la extensión que quieras aunque desde luego sería preferible que
usaras .SQL para que los demás puedan entenderte fácilmente.
- 57 -
Walter R. Ojeda Valiente – Visual FoxPro y Firebird SQL
Conclusión
Aunque para quienes se acostumbraron a usar las tablas .DBF puede resultar
muy complicado al principio, realmente usar Firebird no lo es tanto. Por supuesto que sí
es más complicado pero eso se debe a que tiene mucha mayor potencia y esa mayor
potencia se paga con un incremento en la dificultad de uso. Pero la pregunta que se
deben hacer es: ¿vale la pena? ¿se compensa usar Firebird o es mejor continuar usando
las viejas conocidas tablas .DBF?
Así que, emplearías muy bien tu tiempo adentrándote en el uso de este potente
motor SQL. Te olvidarás de tablas corruptas, índices dañados, poca seguridad de los
datos, lentitud de acceso por Internet. Es otro mundo.
Comentario final:
Como todo documento, éste también puede ser mejorado. Si encuentras algún
error o algo que te gustaría que se le agregara o algo que te gustaría que estuviera mejor
explicado o cualquier idea o sugerencia, házmelo saber y trataré de realizar la
modificación lo antes posible. Mi e-mail es:
wrov@hotmail.com
- 58 -