19
Firebird es un sistema de administración de base de datos relacional (o RDBMS ) (Lenguaje consultas: SQL ) de código abierto , basado en la versión 6 de Interbase , cuyo código fue liberado por Borland en 2000 . Su código fue reescrito de C a C++ . El proyecto se desarrolla activamente, el 18 de abril de 2008 fue liberada la versión 2.1 y el 26 de diciembre de 2009 fue liberada la versión 2.5.0 RC1. La versión 2.5.2, más reciente del proyecto, fue liberada el 6 de noviembre de 2012 . Características Es multiplataforma , y actualmente puede ejecutarse en los sistemas operativos : Linux , HP-UX , FreeBSD , Mac OS , Solaris y Microsoft Windows . Ejecutable pequeño, con requerimientos de hardware bajos. Arquitectura Cliente/Servidor sobre protocolo TCP/IP y otros (embedded). Soporte de transacciones ACID y claves foráneas . Es medianamente escalable . Buena seguridad basada en usuarios/roles. Diferentes arquitecturas, entre ellas el Servidor Embebido 1 (embedded server) que permite ejecutar aplicaciones monousuario en ordenadores sin instalar el software Firebird. Bases de datos de sólo lectura, para aplicaciones que corran desde dispositivos sin capacidad de escritura, como cd-roms. Existencia de controladores ODBC , OLEDB , JDBC , PHP , Perl , .net , etc.

Firebird Lenin

Embed Size (px)

Citation preview

Page 1: Firebird Lenin

Firebird es un sistema de administración de base de datos relacional (o RDBMS) (Lenguaje consultas: SQL) de código abierto, basado en la versión 6 de Interbase, cuyo código fue liberado por Borland en 2000. Su código fue reescrito de C a C++. El proyecto se desarrolla activamente, el 18 de abril de 2008 fue liberada la versión 2.1 y el 26 de diciembre de 2009 fue liberada la versión 2.5.0 RC1. La versión 2.5.2, más reciente del proyecto, fue liberada el 6 de noviembre de 2012.

Características

Es multiplataforma, y actualmente puede ejecutarse en los sistemas operativos: Linux, HP-UX, FreeBSD, Mac OS, Solaris y Microsoft Windows.

Ejecutable pequeño, con requerimientos de hardware bajos. Arquitectura Cliente/Servidor sobre protocolo TCP/IP y otros (embedded). Soporte de transacciones ACID y claves foráneas. Es medianamente escalable. Buena seguridad basada en usuarios/roles. Diferentes arquitecturas, entre ellas el Servidor Embebido1 (embedded server) que

permite ejecutar aplicaciones monousuario en ordenadores sin instalar el software Firebird.

Bases de datos de sólo lectura, para aplicaciones que corran desde dispositivos sin capacidad de escritura, como cd-roms.

Existencia de controladores ODBC, OLEDB, JDBC, PHP, Perl, .net, etc. Requisitos de administración bajos, siendo considerada como una base de datos

libre de mantenimiento, al margen de la realización de copias de seguridad. Pleno soporte del estándar SQL-92, tanto de sintaxis como de tipos de datos. Completo lenguaje para la escritura de disparadores y procedimientos almacenados

denominado PSQL. Capacidad de almacenar elementos BLOB (Binary Large OBjects). Soporte de User-Defined Functions (UDFs). Versión autoejecutable, sin instalación, excelente para la creación de catálogos en

CD-Rom y para crear versiones de evaluación de algunas aplicaciones.

Page 2: Firebird Lenin

Tipos de servidor

Existen dos tipos de servidor Firebird para ser instalados: Classic y Super server. Si bien tienen varias diferencias menores entre sí, la principal consiste en que el super server maneja hilos de ejecución individuales para cada conexión. Por lo tanto para un número reducido de conexiones el recomendado sería el classic porque consumirá menor cantidad de recursos.

En caso de arquitecturas SMP, se debe utilizar el servidor classic porque el Supersever no tiene soporte para este tipo de arquitectura.

Los propios desarrolladores de Firebird recomiendan lo siguiente a la hora de decidirse por uno de estos servidores:

En plataformas Windows seleccionar el Superserver. En Linux simplemente elegir cualquiera, según las conexiones estimadas. En

la mayoría de las situaciones no se notará diferencias en la ejecución.

Podría considerarse un tercer tipo, el Embedded. Éste consiste en una única bibliotéca de enlace dinámico DLL (de unos 2 MB de tamaño) que contiene todo el servidor. De esta forma se puede tener un DBMS completo disponible y distribuíble junto con aplicaciones de usuario sin requerir que este se instale por separado.

Herramientas de administración gráfica IBExpert (Versión personal gratuita) FlameRobin (Código abierto, se ejecuta en Windows, Linux, MacOSX y FreeBSD) DB Workbench Firebird Development Studio

Drivers y componentes de acceso

Componentes para Delphi IB Objects FIBPlus UIB (Unified InterBase Components) Zeos MDO

Page 4: Firebird Lenin

El símbolo delimitador de cadenas

Las cadenas de caracteres en Firebird están delimitadas por un par de comillas simples -'I am a string'– (código ASCII 39, no 96). Si Ud. ha usado versiones previas del pariente de Firebird, Interbase®, recordará que las comillas simples y dobles se podían intercambiar como delimitadores de cadenas. En Firebird, las comillas dobles no se pueden usar como delimitadores de cadenas.

Identificadores con comillas dobles

Antes del estándar SQL-92, no era legal tener nombres de objetos (identificadores) en una base de datos que fueran iguales a las palabras claves del lenguaje, distinguieran mayúsculas de minúsculas, o contuvieran espacios. SQL-92 introdujo un nuevo estándar para hacer legales todas esas cosas, siempre que los identificadores fueran rodeados por un par de símbolos de comilla doble (ASCII 34) y fueran siempre referidos delimitados por comillas dobles.

El propósito de este “regalo” era hacer más fácil migrar metadatos desde RDBMSs no estándares. La parte mala es que, si Ud. elige encerrar un identificador con comillas dobles, distinguirá entre mayúsculas y minúsculas y será obligatorio siempre escribirlo entre comillas dobles.

Firebird permite una ligera relajación de esta regla si se cumple un conjunto de condiciones muy especial: si el identificador que fue definido entre comillas dobles:

1. fue definido totalmente en mayúsculas,2. no es una palabra clave, y

3. no contiene espacios,

...entonces puede ser usado en SQL sin comillas y sin prestar atención a mayúsculas y minúsculas (¡pero en cuanto le pone comillas alrededor, debe coincidir las mayúsculas nuevamente!)

Aviso

No abuse de esta posibilidad! Por ejemplo, si tiene las tablas "TESTTABLE" y "TestTable", ambas definidas entre comillas dobles, y ejecuta el comando:

SQL>select * from TestTable;

...obtendrá los registros de "TESTTABLE", no "TestTable"!

Page 5: Firebird Lenin

A menos que tenga una razón de peso para definir identificadores con comillas, se recomienda que los evite. Firebird acepta sin problemas una mezcla de identificadores con y sin comillas -por lo que no es problema incluir esa palabra clave que Ud. obtuvo de una base de datos antigua, si realmente lo necesita.

Aviso

Algunas herramientas de administración de base de datos imponen el entrecomillado en todos los identificadores por defecto. Trate de elegir una herramienta que tome como opcional el entrecomillado.

Apóstrofos en cadenas

Si Ud. necesita usar un apóstrofo dentro de una cadena de Firebird, puede “escapar” el caracter del apóstrofo precediéndolo con otro.

Por ejemplo, esta cadena producirá un error:

'Joe's Emporium'

porque el evaluador encuentra el apóstrofo e interpreta la cadena como 'Joe' seguida por algunas palabras claves desconocidas.

Para convertir el ejemplo en una cadena legal, duplique el caracter apóstrofo:

'Joe''s Emporium'

Note que son DOS comillas simples, no una doble.

Concatenación de cadenas

El símbolo de concatenación en SQL es un doble “pipe” (ASCII 124, un par sin espacio entremedio). En SQL, el símbolo “+” es un operador aritmético y provocará un error si intenta usarlo para concatenar cadenas. La siguiente expresión agrega el siguiente texto “ Reportado por: ” delante de cada apellido:

'Reportado por: ' || LastName

Tenga cuidado con las concatenaciones. Tenga en cuenta que Firebird generará un error si su expresión intenta concatenar dos o más columnas de tipo char o varchar si la longitud combinada puede exceder el límite máximo de longitud para el tipo char o varchar (32 KB).

Page 6: Firebird Lenin

Vea también en las notas más abajo, Expresiones con NULL, sobre la concatenación de expresiones que involucran NULL.

División de un entero por un entero

Firebird respeta el estándar SQL truncando el resultado (cociente) de una división entero/entero al entero menor. Esto puede generar resultados extraños si no lo tiene en cuenta.

Por ejemplo, este cálculo es correcto en SQL:

1 / 3 = 0

Si Ud. está actualizando desde una RDBMS que resuelve divisiones entre enteros a un cociente real, necesitará alterar las expresiones afectadas para usar un tipo real o numérico escalado para el dividendo, divisor, o ambos.

Por ejemplo, el cálculo anterior puede ser modificado como sigue para producir un resultado distinto de cero:

1.000 / 3 = 0.333

Expresiones con NULL

En SQL, NULL no es un valor. Es una condición, o estado, de un dato, en el cual su valor es desconocido. Debido a que es desconocido, NULL no puede comportarse como un valor. Cuando Ud. intenta realizar operaciones aritméticas con NULL, o lo mezcla con valores en otras expresiones, el resultado de la operación será siempre NULL. No es cero o blanco o una “cadena vacía” y no se comporta como ninguno de estos valores.

Por lo tanto - aquí hay algunos ejemplos de las sorpresas que se puede llevar si intenta realizar cálculos y comparaciones con NULL:

1 + 2 + 3 + NULL = NULL not (NULL) = NULL

'Hogar ' || 'dulce ' || NULL = NULL

if (a = b) then MiVariable = 'Igual'; else MiVariable = 'Distinta';

Page 7: Firebird Lenin

Después de ejecutar este código,MiVariable será 'Distinta' si ambos a and b son NULL. La razón es que la expresión 'a = b' se evalúa a NULL si al menos uno de ellos es NULL. En un contexto de “ if...then ” NULL se comporta como FALSE. Por lo tanto, el bloque 'then' no se ejecuta y se pasa directamente al bloque 'else'.

if (a <> b) then MiVariable = 'Distinta'; else MiVariable = 'Igual';

Aquí, MiVariable será 'Igual' si a es NULL y b no, o viceversa. La explicación es similar a la del ejemplo previo.

Nombre || ' ' || Apellido

resultará NULL si Nombre o Apellido es NULL.

Sugerencia

Piense en NULL como DESCONOCIDO y todos estos extraños resultados comenzarán de repente a tener sentido! Si el valor de Numero es desconocido, el resultado de '1 + 2 + 3 + Numero' también será desconocido (y por lo tanto NULL). Si el contenido de MiCadena es desconocido, entonces también lo es 'MiCadena || SuCadena' (incluso si SuCadena no es NULL). Etcétera.

Page 8: Firebird Lenin

Respaldo (Backup)

La distribución de Firebird contiene una utilidad para respaldar y recuperar sus bases de datos. Su nombre es gbak y se puede hallar en el subdirectorio bin de su instalación de Firebird. Las bases de datos de Firebird se pueden respaldar mientras hay usuarios conectados al sistema haciendo su trabajo normal. El respaldo será tomado de una instantánea del estado de la base de datos al momento de comienzo del mismo.

Hacer respaldos regularmente y ocasionales restauraciones usando gbak deberían ser tareas programadas de su actividad de administración de bases de datos.

Aviso

No use utilidades externas de respaldo propietarias o herramientas de copia de archivos tales como WinZip, tar, copy, xcopy, etc., en una base de datos que esté en uso. No sólo el respaldo será poco confiable, también el bloqueo a nivel de disco usado por estas herramientas puede corromper una base de datos en marcha.

Como corromper una base de datos

1. Modificar las tablas de metadatos por su cuenta2. Deshabilitar la escritura forzada en Windows3. Restaurar un respaldo a una base de datos en ejecución4. Permitir a los usuarios conectarse durante una restauración

1. Modificar las tablas de metadatos por su cuenta

Firebird almacena y mantiene todos los metadatos para sus propios objetos y los del usuario en -una base de datos de Firebird! Más precisamente, las almacena en relaciones (tablas) directamente en la base de datos. Los identificadores de las tablas de sistema, sus columnas y varios otros tipos de objetos de sistema comienzan con los caracteres RDB$.

Page 9: Firebird Lenin

Debido a que son objetos de bases de datos ordinarios, pueden ser consultados y manipulados de la misma manera que los objetos definidos por un usuario. No obstante, el que pueda no implica que deba hacerlo. El motor de Firebird implementa un subconjunto de alto nivel de SQL (DDL) para el propósito de definir y operar sobre objetos de metadatos, típicamente a través de las sentencias CREATE, ALTER y DROP.

Nunca es poca la recomendación de que utilice DDL -no operaciones directas SQL sobre las tablas de sistema- cada vez que necesite alterar o eliminar metadatos. Difiera las operaciones “caseras” hasta que su nivel en SQL y su conocimiento del motor de Firebird se vuelva muy avanzado. Una base de datos retocada no es linda de mantener ni barata de reparar.

2. Deshabilitar la escritura forzada en Windows

Firebird se instala con la escritura forzada (escritura sincrónica) habilitada por defecto. Los datos modificados y agregados son escritos a disco inmediatamente luego de ingresados.

Es posible configurar una base de datos para que utilice escritura de datos asincrónica -donde los datos modificados o nuevos son mantenidos en memoria intermedia para ser volcada a disco periódicamente por el subsistema de E/S del sistema operativo. El término común para esta configuración es escritura no forzada (forced writes off) (o deshabilitada). A veces se recurre a esta configuración para incrementar el rendimiento durante operaciones largas.

La gran advertencia aquí es: no deshabilite la escritura forzada en un servidor Windows. Ha sido observado que las plataformas de servidor Windows no vacían el caché de escritura hasta que el servicio Firebird sea detenido. Aparte de interrupciones de poder, hay demasiadas otras cosas que pueden ir mal en un servidor Windows. Si se detiene, el sistema de E/S queda fuera de alcance y el trabajo de sus usuarios se perderá en el proceso de reinicio.

Nota

Windows 9x y ME no soportan escritura diferida

Deshabilitar la escritura forzada en un servidor Linux

Los servidores Linux son más seguros para ejecutarse con escritura forzada deshabilitada temporalmente. Aún así, no la deje deshabilitada una vez que su lote mayor de tareas esté completo, a menos que tenga un sistema muy robusto de soporte contra fallas de poder.

Page 10: Firebird Lenin

3. Restaurar un respaldo a una base de datos en ejecución

Una de las opciones de la utilidad gbak (gbak -r[estore]) le permite restaurar un archivo gbak sobre una base de datos existente. Es posible que este tipo de restauración se ejecute aún sin advertir que hay usuarios conectados a la base de datos: la corrupción de la base de datos está prácticamente asegurada como resultado.

Aviso

Tenga en cuenta que necesitará diseñar sus herramientas de administración y procedimientos para prevenir la posibilidad para cualquier usuario (incluyento SYSDBA) de restaurar a una base de datos activa si hay algún usuario conectado.

Nota

Por más instrucciones sobre gbak vea el capítulo 21, Database Backup and Restore, de Using Firebird.

Por instrucciones sobre cómo bloquear el acceso a los usuarios, vea el capítulo 14: Getting exclusive access to a database, de Using Firebird.

Si es posible, se recomienda que restaure el respaldo a un lugar vacío del disco usando la opción gbak -c[reate] y verifique la base de datos restaurada usando isql o su herramienta de administración preferida. Si la base de datos restaurada es correcta, desactive (shutdown) el servidor. Haga una copia del archivo de la antigua base de datos y luego copie el archivo (o los archivos) de base de datos restaurados sobrescribiendo los existentes.

4. Permitir a los usuarios conectarse durante una restauración

Si Ud. no bloquea el acceso a los usuarios mientras realiza una restauración usando gbak -r[estore] entonces los usuarios serán capaces de conectarse e intentar operar sobre los datos. En este caso, el resultado serán estructuras corruptas.

Page 11: Firebird Lenin

Ejemplos de consultas

Outer Join

Select f.numero_factura, df.codigo from factura f left outer join detalle_factura df on df.numero_factura = f.numero_factura where condiciones;

if

if (a = b) then MyVariable = 'Equal';else MyVariable = 'Not equal';

if (a <> b) then MyVariable = 'Not equal';else MyVariable = 'Equal';

While

WHILE (<condicion>) DO <sentencia compuesta> <sentencia compuesta>= {<bloque> | <sentencia>;}

WHILE (i<23) DOi=i+1;persona[i] = i;

Page 12: Firebird Lenin

Triggers o desencadenantes

Es un modulo que se ejecuta de forma automática cuando se cambia el estado de una fila como respuesta a una petición, los triggers se ejecutan a nivel de filas, una por cada imagen de fila cambiada.

Un trigger se puede ejecutar en una de dos fases en tiempo de ejecucion de la petición de cambio realizada, antes de escribir (before) o después (after), en el trigger se define esta fase en relación a un evento (inserción, actualizacion o borrado) o varios de ellos

Tipo Trigger DescripciónBEFORE INSERT Se lanza antes de que se cree una nueva fila.

Permite que se puedan cambiar los valores de entrada

AFTER INSERT Se dispara después de que se cree una nuevaVersión del registro.No se permite cambiar los valores de entrada.Normalmente se usa para modificar otras tablas

BEFORE UPDATE Se dispara antes de que se cree una nueva versióndel registro. Se permiten cambios en los valores de entrada

AFTER UPDATE Se lanza después de que se cree una nueva versióndel registro.No se permiten cambios en los valores de entrada.Normalmente se usa para modificar otras tablas

BEFORE DELETE Se lanza antes de que una fila existente se borre.No acepta cambios a ninguna columna en la fila

AFTER DELETE Se dispara después de que una fila es borrada.No se aceptan cambios a ninguna columna en lafila.Normalmente se usa para modificar otras tablas

BEFORE <evento>OR <evento>[OR <evento>]

Se dispara antes de que se ejecute cualquier cambio en el estado del dato. Se codifican las acciones de forma condicional.Se pueden hacer cambios en las columnas de lafila afectada salvo que sea una acción de borrado

AFTER <evento>OR <evento>[OR <evento>]

Se dispara después de que se ejecute cualquier cambio en el estado del dato.Se codifican las acciones de forma condicional.No se pueden hacer cambios de la fila afectada

Page 13: Firebird Lenin

Un trigger puede estar activo o inactivo, Sólo se disparan los triggers activos.El estado se puede modificar mediante la sentencia ALTER. Un trigger se crea mediante la sentencia CREATE TRIGGER:

CREATE TRIGGER nombre FOR {tabla | vista} [ACTIVE | INACTIVE ]{BEFORE | AFTER } {{DELETE | INSERT | UPDATE }|{DELETE OR{[INSERT [OR UPDATE]}|{INSERT OR [...]}|{UPDATE OR [...]}}} [POSITION numero] AS – aquí empieza el cuerpo del trigger [DECLARE [VARIABLE] variable tipo[{= | DEFAULT} valor]; BEGIN

<sentencias> END <terminador>

CREATE TRIGGER BI_BANCOS FOR BANCOS BEFORE INSERT AS BEGIN

new.nom_banco=upper(new.nom_banco); -- pasamos a mayúsculas el nombre del banco END

CREATE TRIGGER BI_BANCOS FOR BANCOS BEFORE INSERT AS BEGIN IF (new.cod_banco is null) then -sino se ha indicado un cod_banco

new.cod_banco=gen_id(gen_cod_banco,1); --se recoge el cod_banco del generador END

Page 14: Firebird Lenin

COMMITEl commit en firebird se determina a través de un vector que configura los parámetros de las transacciones que van a determinar su comportamiento, en el caso de no crearlo, el servidor creará uno por defecto

ROLLBACK

ROLLBACK RETAINDeshace todos los cambios que fueron cargados a la base de datos dentro de la transacción sin haberla cerrado

ROLLBACK TO SAVEPOINTDeshace los Cambios hechos a la base de datos desde la Creacion del savepoint

SAVEPOINTCrea un savepoint, el cual va a Permitir hacer rollback hasta un punto determinado sin necesidad de deshacer toda la transacción

create table test (id integer);commit;insert into test values (1);commit;insert into test values (2);savepoint y;delete from test;select * from test; -- no devuelve filasrollback to y;select * from test; -- devuelve dos filasrollback;select * from test; -- devuelve una fila