Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Visual FoxPro y Firebird SQL
Visual FoxPro y Firebird SQL
PARTE 1: Cliente/Servidor..................................
Servidores de archivos compartidos y Cliente/Servidor...
Sistemas Cliente/Servidor...............................
Como funciona Cliente/Servidor..........................
Cuales son las ventajas de usar Cliente/Servidor?......
Como mostrar los datos al usuario.......................
Manera eficiente de enviar/recibir datos del Servidor...
Claves primarias........................................
Relaciones..............................................
Concurrencia............................................
Transacciones...........................................
Diferencia de terminologa..............................
5
5
5
6
6
7
7
9
9
9
10
10
PARTE 2: Firebird..........................................
Qu es Firebird?.......................................
Tipos de Servidor.......................................
Recursos utilizados.....................................
Plataformas y versiones para el Servidor................
Plataformas y versiones para el Cliente.................
Caractersticas principales de Firebird.................
Conectividad............................................
Herramientas............................................
Instalando el Servidor..................................
Instalando el Cliente...................................
Instalando el driver ODBC...............................
Verificando la instalacin..............................
El archivo HOST.........................................
El archivo ALIASES.CONF.................................
El archivo FIREBIRD.CONF................................
El archivo SECURITY2.FDB................................
Como evitar la corrupcin de las Bases de Datos.........
Como corromper una Base de Datos........................
Dialectos SQL (SQL dialect).............................
Tamao de la pgina (page size).........................
Conjunto de caracteres (character set)..................
Scripts.................................................
El usuario SYSDBA.......................................
Agregando nuevos usuarios...........................
Borrando usuarios...................................
Listando todos los usuarios.........................
Cambiando la contrasea de un usuario...............
Nombres de los usuarios.............................
Contraseas (passwords) de los usuarios.............
Como proteger las Bases de Datos........................
11
11
11
11
12
12
12
13
14
14
14
15
15
16
16
17
17
17
17
18
18
18
19
20
21
21
21
22
22
22
22
-1-
-2-
22
23
23
23
24
24
24
24
25
25
25
25
25
25
26
26
26
26
26
26
26
26
26
26
26
27
27
27
27
27
27
27
27
27
27
27
28
28
28
29
30
30
30
31
31
31
31
32
32
32
32
34
35
36
37
37
41
42
42
44
45
45
46
46
46
47
48
48
49
49
50
50
50
51
52
52
52
53
54
54
54
54
56
Conclusin.................................................
58
-3-
38
39
40
40
41
-4-
Parte 1. Cliente/Servidor
Servidores de archivos compartidos y Cliente/Servidor
Mediante el uso de servidores de archivos compartidos es como Visual FoxPro,
Clipper, DBase, Paradox, Access y otros lenguajes manejan los datos. En este caso el
servidor de archivos es una caracterstica del Sistema Operativo, no del lenguaje. Es el
Windows quien te da acceso a los archivos que estn en una carpeta compartida. Un
programa que se encuentra en otra computadora de la red lee esos archivos en la
memoria de su propia computadora y graba datos en ellos como si estuvieran en su
disco local. El gran problema con este aprovechamiento es la fragilidad de los datos,
que pueden daarse o corromperse. Es bastante frecuente encontrarse con tablas o
ndices daados. Un corte de la energa elctrica o un reset en cualquiera de las
computadoras de la red puede corromper las tablas o los ndices. Adems, como las
carpetas son compartidas algunos humanos (por intencin o por ignorancia) pueden
borrar o modificar los archivos que en ellas se encuentran.
En cambio en un sistema Cliente/Servidor los clientes (aunque estn localizados
en la misma computadora que el Servidor) nunca tocan los datos directamente, sino que
envan mensajes al Servidor dicindole lo que quieren hacer. El Servidor procesa esos
mensajes y ejecuta los pedidos usando su propio cdigo y administrando el espacio en
el disco duro, en forma independiente del Sistema Operativo. Un humano que est
sentado frente a otra computadora de la red y que tuviera la (mala) intencin de
modificar una Base de Datos necesitar conocer:
el nombre de la computadora donde se encuentra la Base de Datos
el motor utilizado (Firebird, Postgre, MySQL, etc.)
la carpeta donde se encuentra la Base de Datos
el nombre de la Base de Datos
el nombre de un usuario de esa Base de Datos
la contrasea de ese usuario
algunos conocimientos de programacin para poder conectarse a ella
En un sistema de archivos compartidos, es muy fcil que cualquiera consiga acceso
a la carpeta compartida y a partir de all ya puede borrar o modificar todas las tablas y
eso es un peligro potencial muy grave!!!
Sistemas Cliente/Servidor
Un sistema Cliente/Servidor (tal como Firebird) est compuesto por dos
mdulos de software diseados para comunicarse entre s usando el mismo protocolo de
comunicacin. El Cliente enva mensajes al Servidor pidindole 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-
Este es un concepto que se debe entender muy bien: los datos que recibe el
Cliente (y que luego enva a la aplicacin) 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:
La APLICACIN enva un pedido al CLIENTE quien lo enva al SERVIDOR
El SERVIDOR enva la respuesta al CLIENTE quien la enva a la APLICACIN
La aplicacin puede ser un sistema de Contabilidad, de Facturacin, de Sueldos, etc.
APLICACIN
(Contabilidad,
Facturacin,
Sueldos,
Tesorera, etc.)
Pedido
Respuesta
Pedido
CLIENTE
Respuesta
SERVIDOR
-6-
aplicacin
Los procesos que requieren acceso a las tablas deben realizarse en el
Servidor, nunca en la aplicacin
Un ejemplo: una aplicacin enva una peticin 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 vaca. Eso es un error de
concepto. Por qu? porque esa verificacin pudo haberse realizado en la aplicacin, la
peticin de consulta viaj por la red y el mensaje de error tambin. O sea, hubo un
trfico innecesario en la red, lo cual la hace ms 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-
-8-
Claves primarias
Cada tabla debe tener s o s una clave que identifique a cada fila (registro) de
manera inequvoca (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 lgico.
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 forneas o extranjeras
(FK = Foreign Key). Ese relacionamiento es persistente, o sea que estar en vigencia
sea cual sea la aplicacin que utilice a esa Base de datos.
Concurrencia
En una aplicacin multi-usuario puede ocurrir que dos o ms 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-
Transacciones
Esto puede ser un poco difcil de entender al principio ya que cuando se usan
tablas .DBF los datos quedan grabados despus que el usuario hizo click sobre el botn
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
transaccin. Una transaccin empieza cuando el Cliente la inicia (a pedido de la
aplicacin), a partir de ese momento y hasta que finaliza (tambin por pedido de la
aplicacin al Cliente) puede realizar pedidos al Servidor.
Durante este perodo se pueden grabar/borrar/modificar filas (registros) y estas
operaciones son grabadas en el disco duro pero no cambian el estado de la Base de
Datos, o sea que aunque ya se grabaron en el disco duro todava son reversibles.
La transaccin finaliza cuando la aplicacin le pide al Cliente que las
operaciones sean permanentes (commit) o que sean desechadas si ocurri algn error
(roll back).
En este ltimo caso se aplica la regla de la atomicidad: si aunque sea un cambio
a la Base de Datos fall entonces todos los cambios son desechados. Por lo tanto: o se
graban todos o ninguno. Esto incluye cualquier cambio realizado por desencadenantes
(triggers) o procedimientos almacenados (stored procedures).
Diferencia de terminologa
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.
fila
columna
---------->
---------->
registro
campo
- 10 -
Parte 2. Firebird
Qu es Firebird?
Es un motor de bases de datos relacionales SQL. Es Open Source (cdigo
abierto) y es totalmente gratis, tanto para uso privado como para uso comercial. Tiene
todas las caractersticas 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 fcilmente de uno a otro. El
recomendado para usar en Windows es el llamado SuperServer y por lo tanto las
siguientes referencias sern a ese. Sin embargo, si la computadora tiene varios
procesadores entonces Classic o SuperClassic seran los preferibles. Para aplicaciones
monousuario o para catlogos en CD o programas similares se puede usar Embedded,
ya que no necesita instalacin, 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 ms 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 conexin a la Base de Datos. Una regla mnemnica fcil 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 muchsimas conexiones sin ningn problema.
El espacio requerido en el disco duro es de alrededor de 14 Mb, aunque un poco
ms puede ser necesario para realizar almacenamiento temporario.
- 11 -
Windows Seven
Windows Vista
Windows XP Profesional
Windows 2008 Server
Windows 2003 Server
Windows 2000 Server
Windows NT 4
Windows ME
Windows 98
Windows 95
Linux
FreeBSD
varios UNIX
Mac OS X (Darwin)
Sun Solaris SPARC e Intel
HP-UX
Conectividad
Firebird acepta los siguientes mtodos: 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 -
Herramientas
Hay muchos programas que pueden usarse con Firebird, incluyendo
administradores grficos, replicadores, auditoras, generadores de datos, analizadores de
estadsticas del Servidor, etc.
Es ms que aconsejable utilizarlos, porque se ahorra muchsimo tiempo al
hacerlo.
Entre los administradores grficos ms conocidos se cuentan los siguientes:
FlameRobin (gratis)
SQL Manager for InterBase and Firebird (la versin Lite es gratis)
IBExpert (tiene una versin personal gratis)
DB Workbench (la versin Lite es gratis)
Firebird Development Studio (30 das gratis)
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 versin estable. Se lo puede descargar de:
http://www.firebirdsql.org/index.php?op=files&id=engine
El Servidor se debe instalar en una sola computadora de la red, en aquella donde
se encontrarn todas las Bases de Datos.
Instalando el Cliente
Aunque se lo puede instalar manualmente, lo mejor es hacerlo mediante el
programa de instalacin.
El Cliente se debe instalar en cada computadora de la red. Se lo puede instalar
CON las herramientas administrativas o SIN las herramientas administrativas. Lo mejor
es instalarlo SIN esas herramientas porque los usuarios comunes no deben tener acceso
a ellas.
Pero en la computadora que se usar para desarrollar aplicaciones hay que
instalar el Cliente CON las herramientas administrativas.
Tambin es posible instalar en la misma computadora el Servidor y el Cliente.
- 14 -
Verificando la instalacin
Verificando la conexin a la computadora donde se encuentra el Servidor
Para verificar que la red funciona correctamente y que la computadora donde se
encuentra el Cliente puede comunicarse con la computadora donde se encuentra el
Servidor se debe abrir una ventana de comandos en la computadora del Cliente y luego
escribir lo siguiente:
ping 192.21.7.15 -1 65500 - t
sustituyendo esa direccin IP por la que corresponda a la computadora donde se
encuentra el Servidor. Esto se llama ping con carga mxima y asegura que la
comunicacin puede realizarse exitosamente.
- 15 -
El archivo HOST
Una manera de ocultar la direccin 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 direccin IP.
Si en la carpeta C:\WINDOWS\ no encuentras un archivo llamado HOST, debe
haber un archivo llamado HOSTS.SAM, renmbralo como HOST.
Ejemplos:
192.168.0.11
65.215.221.149
127.0.0.1
MiServidor
apress.com
localhost
El archivo ALIASES.CONF
Este es un archivo que se encuentra en la carpeta raz 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
Conexin:
Para conectarse a la Base de Datos se podra escribir:
10.12.13.2:C:\SISTEMAS\SQL_CONTA\CONTA.FDB
o:
10.12.13.2:Conta
o:
MiServidor:Conta
Esta ltima es la preferible porque los curiosos no podrn saber ni la IP del
Servidor ni la carpeta ni el nombre real de la Base de Datos.
- 16 -
El archivo FIREBIRD.CONF
Este es un archivo que permite configurar al Firebird, se encuentra en su carpeta
raz y sus valores pueden ser cambiados, de acuerdo a la necesidad.
En general, los valores que tiene son los ms adecuados para la mayora de las
situaciones, pero si no es as, cambiarlos es muy fcil. 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
contraseas), 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 configuracin.
Restaurando un backup en una Base de Datos que se est ejecutando. Si los
usuarios estn usando una Base de Datos, no debes restaurar sobre ella.
Permitir a los usuarios que se conecten durante una restauracin. Mientras
se est restaurando una Base de Datos, nadie debe estar conectado.
- 17 -
- 18 -
Scripts
Adems de crear las Bases de Datos, Dominios, Tablas, ndices, etc.
manualmente, tambin se tiene la posibilidad de hacer esas tareas automticamente a
travs de un script.
Un script es un archivo de texto plano usualmente con la extensin .SQL en el
cual se colocan los comandos que se desean ejecutar. Son muy tiles para reconstruir la
estructura de una Base de Datos o de una Tabla en la misma o en otra computadora.
Ejemplo:
CREATE TABLE Paises (
Codigo SmallInt NOT NULL,
Nombre VarChar(25) NOT NULL,
Capital
VarChar(25),
Poblacion BigInt,
PRIMARY KEY (Codigo)
);
INSERT INTO Paises VALUES(595, Paraguay, Asuncin, 6500000);
INSERT INTO Paises VALUES(1, Estados Unidos, Washington, 310000000);
INSERT INTO Paises VALUES(86, China, Beijing, 1250000000);
VarChar(20),
VarChar(12)
);
- 19 -
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 contrasea de ese usuario es masterkey (en realidad, masterke,
solamente se consideran los primeros ocho caracteres).
Lo primero que debes hacer apenas has instalado el mdulo Servidor del
Firebird es cambiar esa contrasea por qu? porque la contrasea 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 organizacin hay un enemigo interno, ser la primera
contrasea que probarn.
Para cambiar la contrasea 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:
- 20 -
Aqu se agregaron tres nuevos usuarios. Walter, con contrasea 123456, Silvia,
con contrasea hermosa y Erika con contrasea japonesa.
Borrando usuarios
El usuario SYSDBA tambin puede borrar usuarios, como se ve en la siguiente
pantalla:
Para ver los nombres de todos los usuarios se utiliza el comando display.
- 21 -
- 22 -
Privilegios
Los privilegios que pueden ser otorgados a los usuarios (y revocados) son los
siguientes:
Nombre del privilegio
SELECT
INSERT
UPDATE
DELETE
REFERENCES
ALL
EXECUTE
ROLE
- 23 -
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
podrn ver los Balances ni los datos de los empleados.
Los roles son especficos de cada Base de Datos, un rol creado para una Base de
Datos no funcionar en otra.
La implementacin de roles tiene los siguientes pasos:
1. Crear un rol (usando CREATE ROLE)
2. Asignar privilegios al rol (usando GRANT privilegios TO NombreRol)
3. Asignar el rol a los usuarios (usando GRANT NombreRol TO Usuario)
4. Especificar el rol, adems del nombre del usuario, al conectarse a una BD
Creando un rol
La sintaxis para crear un rol es muy simple:
CREATE ROLE <NombreRol>
Ejemplos:
/* Se crea el rol R_PRODUCTOS, que tiene todos los privilegios sobre la tabla PRODUCTOS y se le asigna a Silvia */
CREATE ROLE R_PRODUCTOS;
GRANT ALL ON PRODUCTOS TO R_PRODUCTOS;
GRANT R_PRODUCTOS TO 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 */
CREATE ROLE R_VENDEDORES;
GRANT SELECT ON VENDEDORES TO R_VENDEDORES;
GRANT R_VENDEDORES TO SILVIA;
- 24 -
Crear un dominio
CREATE DOMAIN NumeroEntero INTEGER;
CREATE DOMAIN NombrePersona VARCHAR(30);
- 25 -
- 26 -
Agrupar filas
SELECT Codigo, Apellidos, Nombres FROM Personas GROUP BY Apellidos, Nombres, Codigo;
todas las columnas que estn antes del GROUP BY deben estar tambin despus, aunque pueden estar en distinto orden
- 27 -
El programa ISQL.EXE
Interactive SQL es un programa de lnea de comandos que incorpora
herramientas y tcnicas 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 grficamente, 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.
Se encuentra en la carpeta \BIN del Firebird.
- 28 -
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
misin es realizar copias de seguridad (backups) de las bases de datos y restaurarlas
cuando sea necesario. Tambin detecta corrupcin 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), tambin se lo usa para restaurar el
backup en otra plataforma (de Windows a Linux, por ejemplo).
IMPORTANTE: Nunca debes usar programas como WinZip o WinRar para
comprimir tu base de datos si el Firebird est en ejecucin.
IMPORTANTE: El archivo de backup generado por el programa GBAK no
puede ser usado directamente porque el Servidor no lo reconocer, antes de ser usado
debe ser restaurado con una versin de GBAK igual o posterior a la usada para crearlo.
IMPORTANTE: Los usuarios pueden continuar trabajando normalmente
mientras se realiza el backup, pero los datos que se graban son los que se encontraban
en la base de datos en el momento que GBAK se inici. Todos los cambios que los
usuarios hagan despus no sern grabados en el archivo de backup.
- 29 -
Aqu el usuario SYSDBA cuya contrasea 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 hacer el backup y la restauracin completos o incrementales. Este ltimo
slo tiene los cambios ocurridos desde el ltimo backup.
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 -
- 31 -
- 32 -
Una vez que la Base de Datos est registrada, se ver una pantalla, similar a la
siguiente:
Haciendo doble click sobre EMPLOYEE se vern todos sus componentes, como
a continuacin se muestra:
- 33 -
- 34 -
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 grabacin verifica que el valor sea mayor que cero
(CHECK (VALUE > 0))
Aqu hay otro ejemplo, el dominio EmpNo (nmero del empleado):
CREATE DOMAIN EMPNO AS
SMALLINT;
- 35 -
- 36 -
- 37 -
- 38 -
- 39 -
- 40 -
- 41 -
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 daar a las relaciones.
Especficamente se trata de proteger las relaciones entre dos tablas.
Por qu se debera proteger las relaciones entre dos tablas?
1) Prueba de fuego. Las restricciones referenciales (especialmente cuando
usadas inteligentemente con otras restricciones) protegern fuertemente las
reglas de negocio de la aplicacin contra errores, sin importar de donde
provengan ellos. Esto es de mucha importancia cuando la Base de Datos ser
manipulada por otras personas, algunas quizs con un nivel bastante bajo.
2) Velocidad de las consultas. Los ndices creados automticamente para la
integridad referencial aumentarn la velocidad de las consultas.
3) Control de calidad. Durante la etapa de desarrollo y verificacin los errores
se encontrarn pronto porque la Base de Datos rechazar operaciones que
rompan las reglas.
4) Documentacin automtica. En los scripts que hagas podrn verse las
reglas, evitando as escribir documentos especficos (ya que todos saben que
a la mayora de los programadores no les gusta escribir documentacin).
La integridad referencial entre dos tablas se crea a travs de una restriccin
foreign key (clave fornea). Esta restriccin protege a la tabla contra los intentos de
grabar filas que son inconsistentes con el modelo de datos.
La restriccin foreign key
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.
Por ejemplo: si se tienen dos tablas, una llamada PRODUCTOS y la otra
llamada VENTASDET (detalle de ventas), las filas de la tabla VENTASDET dependen
de la tabla PRODUCTOS. O sea, no se puede vender un producto cuyos datos no se
encuentren en la tabla PRODUCTOS.
Qu implica esto?
1) Que primero se deben cargar los datos de los productos antes de poder
venderlos
2) Que la tabla PRODUCTOS debe tener una clave primaria (el cdigo del
producto)
3) Que la tabla VENTASDET debe tener una restriccin foreign key sobre el
cdigo del producto.
4) Que no se puede tener una fila en VENTASDET que no haga referencia a
una fila en PRODUCTOS.
- 42 -
Aunque no exista un producto con ese Cdigo igual se puede grabar un registro
en VENTASDET
Aunque se deje en blanco el campo Cdigo del Producto, igual se puede grabar
un registro en VENTASDET
Se puede borrar un registro de la tabla PRODUCTOS aunque el cdigo de ese
registro se est utilizando en la tabla VENTASDET
Se puede cambiar el cdigo de un producto aunque ese cdigo se est utilizando
en la tabla VENTASDET
O sea, es ms fcil meter la pata (hacer algo malo o incorrecto) en Visual FoxPro.
Solamente por esta caracterstica ya deberas pensar seriamente en usar tablas Firebird.
Cuando se define una FK (Foreign Key) se le puede decir al Firebird que
acciones deber tomar cuando se quiera borrar o modificar la PK (Primary Key). Estas
acciones pueden ser:
ON DELETE {NO ACTION | CASCADE | SET NULL | SET DEFAULT}
ON UPDATE {NO ACTION | CASCADE | SET NULL | SET DEFAULT}
No action
Es el valor por defecto, por lo tanto puede ser (y generalmente es) omitido. Su
accin 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 tambin son borradas.
On Update Cascade
Cuando se modifica un cdigo en la tabla PADRE los cdigos relacionados de la
tabla HIJO son tambin modificados para que todos tengan el mismo valor.
Set Null
Cuando se borra o modifica un cdigo de la tabla PADRE los cdigos
relacionados de la tabla HIJO son puestos a null, por lo tanto esas filas quedan
hurfanas. Generalmente esta accin no es recomendada ya que se pierde la ventaja de
la integridad referencial. Naturalmente esta accin no puede realizarse si la columna
cdigo de la tabla HIJO no admite valores nulos.
- 43 -
ndices
Los ndices son atributos de las tablas que pueden ser localizados sobre una
columna o conjunto de columnas para acelerar la recuperacin de filas.
Lmites
Firebird admite hasta 256 ndices por tabla.
Cada ndice puede tener hasta 253 bytes.
ndices automticos
Las restricciones PK y FK automticamente crean sus propios ndices. Cuando
crees tus ndices es importantsimo no duplicar los ndices que ya ha creado el Firebird
porque en ese caso el motor podra estar en la duda de cual usar (porque ambos son
idnticos) y podra decidir no usar ninguno de ellos (haciendo tus bsquedas mucho ms
lentas).
Direccin de los ndices
Todos los ndices pueden ser ascendentes (de menor valor a mayor valor) o
descendentes (de mayor valor a menor valor).
Es un error muy comn creer que con un solo ndice se obtendrn los mismos
resultados tanto si se buscan valores altos como valores bajos. La regla a aplicar es la
siguiente:
Si buscas valores bajos, debes usar un ndice ascendente
Si buscas valores altos, debes usar un ndice descendente
Cuando indexar
Cada ndice ocupa espacio en disco, adems 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 ms. Una buena prctica 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 usarn 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 -
Transacciones
Recuerda que en Firebird las aplicaciones nunca tocan los datos que estn
almacenados en una Base de Datos. En lugar de eso, las aplicaciones realizan
conversaciones con el Servidor a travs de los pedidos que hacen y las respuestas que
reciben. Una conversacin completa entre un cliente y el Servidor se llama transaccin.
Por qu se usan las transacciones?
Porque cuando muchos usuarios estn actualizando y consultando los mismos
datos muchos problemas pueden ocurrir:
Actualizaciones perdidas
Esto ocurre cuando dos usuarios estn viendo los mismos datos. El primero de
ellos realiza algunos cambios, poco despus el segundo realiza otros cambios. Por lo
tanto se pierden los cambios que haba hecho el primero.
Lecturas sucias
Esto le permite a un usuario ver los cambios que otro usuario est haciendo, pero
sin tener la garanta de que esos cambios sean finales.
Lecturas no reproducibles
Ocurren cuando un usuario est seleccionando filas continuamente mientras
otros usuarios estn 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 estn siendo accedidas por otros usuarios. Esto suele
suceder cuando no hay forma de controlar el orden en el cual se realizan los cambios.
Para resolver estos problemas el Firebird aplica un modelo de administracin
que asla cada tarea dentro un contexto nico el cual le impide que sea completada si
pone en riesgo otras tareas. La Base de Datos no cambiar si hay algn conflicto.
Cada transaccin tiene un contexto nico que causa que est aislada de todas las
dems transacciones. Las reglas para ese contexto son especificadas por la aplicacin
cliente pasando parmetros de transaccin.
Cundo se inicia una transaccin?
Cuando un Cliente pide que se inicie y recibe un handle del Servidor. Desde ese
momento la transaccin est activa.
- 45 -
- 46 -
Por ejemplo:
El usuario Juan cambia el nmero de telfono del proveedor TodoFrutas S.A
El usuario Juan imprime los nmeros de telfono de todos los proveedores. El
nuevo nmero de telfono de TodoFrutas S.A. aparece en ese informe
El usuario Mara imprime los nmeros de telfono de todos los proveedores. El
viejo nmero de telfono de TodoFrutas S.A. aparece en ese informe
El usuario Juan graba en forma permanente los cambios (hace un commit)
Los dems usuarios (Mara y los otros) recin ahora pueden ver el nuevo nmero
de telfono del proveedor TodoFrutas S.A.
Datos desechados
El roll back nunca falla. Nunca. Este desecha todos los cambios que se
realizaron en la transaccin, tanto el que caus el error como todos los dems que se
hubieran grabado exitosamente de no haber ocurrido el error.
Por ejemplo:
Se inicia una transaccin
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 haba agregado a PROVEEDORES es eliminado
o La compra que se haba agregado a COMPRASCAB es eliminada
- 47 -
- 48 -
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 travs de un driver ODBC.
En el DSN se especifican el nombre de la Base de Datos, la carpeta, el driver
ODBC, el nombre del usuario, la contrasea y alguna otra informacin relevante. Una
vez que se cre un DSN para una Base de Datos se lo puede usar en cualquier
aplicacin para conectarse a esa Base de Datos.
La conexin tambin puede realizarse sin DSN. En este caso toda la informacin
necesaria para la conexin se escribe dentro de la aplicacin. Si la conexin es sin DSN,
en lugar de utilizar un driver ODBC se puede usar OLE DB o algn otro mtodo.
La primera opcin (conectarse con DSN) es til cuando varias aplicaciones
(quizs creadas con distintos lenguajes) deben conectarse a la misma Base de Datos. La
segunda opcin (conectarse sin DSN) es preferible si una sola aplicacin se conectar.
- 49 -
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 ms tiles
cuando se crean procedimientos o funciones que las manipulan.
Funcin para conectarse a una Base de Datos usando DSN
Si definiste un DSN (como se explic anteriormente), entonces puedes usar la
siguiente funcin para conectarte a una Base de Datos:
Function CONECTAR_CON_DSN
with This
.lnHandle
= SQLConnect(.lcNombreConexion, .lcUsuario, .lcContrasena)
.lnResultado = iif(.lnHandle > 0, 1, -1)
endwith
Return(This.lnResultado)
*
*
- 51 -
En este caso hay que armar una cadena de conexin y usar la funcin
SQLStringConnect().
Al igual que antes en la propiedad lnResultado se guardar el resultado del
intento de conexin. Un valor de 1 (uno) significa xito y un valor de -1 (menos uno)
que hubo algn problema.
Funcin para desconectarse de una (o todas) Base de Datos SQL
Antes de finalizar tu aplicacin lo correcto es que te desconectes de la Base de
Datos que estuviste usando.
Function DESCONECTAR
with This
if .lnHandle == 0
- 52 -
- 53 -
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 obtendrs
informacin que te resultar de utilidad para saber qu ests haciendo mal. Por ejemplo:
- 55 -
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.
Ejemplo N 2. Una pequea aplicacin administrativa (stock, compras, ventas)
Un pequeo negocio ha pedido que se le haga una aplicacin para ayudarle con
el control del mismo. Ellos se dedican a vender bebidas, es lo nico que venden y no
tienen previsto vender algo ms. En su lista hay cervezas, vinos, whiskies, gaseosas,
aguas minerales, pero su fuerte son las bebidas alcohlicas, en especial las cervezas. El
negocio abre los 7 das de la semana, inclusive cuando hay partidos de ftbol
importantes o algn otro acontecimiento los das 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
adems de un sueldo fijo se le paga una comisin del 3% sobre las ventas realizadas.
Todas las compras y todas las ventas son al contado, a nadie se le vende a crdito, por
ningn motivo. Los clientes no pueden retirar la mercadera 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.
La aplicacin se realizar en Visual FoxPro, usando Firebird SQL como motor
de la Base de Datos.
Despus del anlisis correspondiente se ha encontrado que se necesitarn las
siguientes tablas:
Vendedores
Proveedores
Productos
Movimientos cabecera
Movimientos detalles
Se han determinado las siguientes restricciones:
Ninguna fecha de compra o de venta puede faltar
Ninguna fecha de compra o de venta puede ser anterior al 1 de enero de 2011
Ninguna cantidad, comprada o vendida, puede faltar
Toda cantidad, comprada o vendida, debe ser mayor que cero
- 56 -
Para crear la Base de Datos, los dominios, tablas y vistas se utilizaron scripts, de
tal manera que sea muy fcil reconstruirla en caso de necesidad.
En ISQL se utiliza la instruccin INPUT para ejecutar un script, como se ve a
continuacin:
Por convencin los scripts tienen la extensin .SQL pero no es obligatorio, a tus
scripts puedes ponerles la extensin que quieras aunque desde luego sera preferible que
usaras .SQL para que los dems puedan entenderte fcilmente.
- 57 -
Conclusin
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 ms 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?
La respuesta a ambas preguntas es un rotundo s. Las ventajas que se obtienen de
usar Firebird son muy grandes comparadas con el tiempo que se emplear en aprenderlo
a cabalidad.
Las tablas .DBF ya estn obsoletas, en aplicaciones nuevas ni siquiera deberan
considerarse. Y si se las va a reemplazar entonces, sin ninguna duda, Firebird es una de
las mejores alternativas que actualmente existen.
As que, emplearas muy bien tu tiempo adentrndote en el uso de este potente
motor SQL. Te olvidars de tablas corruptas, ndices daados, poca seguridad de los
datos, lentitud de acceso por Internet. Es otro mundo.
Dedcate a aprender SQL. Y Firebird. Ganars mucho.
Comentario final:
Como todo documento, ste tambin puede ser mejorado. Si encuentras algn
error o algo que te gustara que se le agregara o algo que te gustara que estuviera mejor
explicado o cualquier idea o sugerencia, hzmelo saber y tratar de realizar la
modificacin lo antes posible. Mi e-mail es:
wrov@hotmail.com
- 58 -