Sei sulla pagina 1di 32

MASTERING FIREBIRD

CON VISUAL FOXPRO


Preguntas, Respuestas y muchos Ejemplos

ELIGIENDO LA ARQUITECTURA DE FIREBIRD QUE SE INSTALAR


Si la computadora donde se instalar el Servidor tiene varios procesadores (multi-core)
entonces debe elegirse Classic o SuperClassic, no SuperServer.
Sin embargo, segn pruebas intensivas realizadas, el SuperServer:
1. Si se tendrn menos de 20 usuarios concurrentes, SuperServer es la mejor opcin,
aunque tiene el problema del congelamiento (las transacciones pequeas se quedan
esperando hasta que terminen las transacciones grandes)
2. Est limitado al uso de una sola CPU/ncleo
El Classic:
1. No es la mejor opcin si hay pocos usuarios (menos de 20)
2. Es la recomendable si hay ms de 20 usuarios
El SuperClassic:
1. Con pocos usuarios es menos eficiente que el SuperServer
2. Con muchos usuarios es menos eficiente que el Classic
3. Por lo tanto, su uso no es recomendable
INSTALANDO EL SERVIDOR EN LINUX
Cul es la distribucin recomendada?
La que t prefieras
Debo elegir una versin Server, Desktop o cualquiera de ellas?
Server (servidor) es mucho ms recomendable ya que las versiones Desktop (escritorio)
aunque tambin funcionan bien, no estn optimizadas para ser usadas como servidores. Las
versiones de escritorio son las que normalmente utilizan los usuarios, es la que tienen instalada
para usar planillas de clculo, procesadores de texto, navegar en Internet, etc. En cambio las
versiones Server se utilizan para tener en ellos bases de datos.
POR QU INSTALAR FIREBIRD EN LINUX?
Seguridad
Velocidad: las particiones Linux formateadas con ext3 (averiguar ms sobre esto) son
mucho ms rpidas que las particiones Windows formateadas con NTFS

INSTALANDO FIREBIRD EN WINDOWS VISTA Y WINDOWS SEVEN


Cuando se lo instala en alguno de estos SO la opcin Instalar el Applet del Panel de
Control? no debe estar seleccionada porque crea conflictos.
En el caso que eso haya ocurrido entonces lo mejor es desinstalar el Firebird y volver a
instalarlo aunque ahora sin instalar el applet.
Para desinstalar el Firebird se puede ejecutar el programa:
C:\Archivos de Programa\Firebird\Firebird_2_5\unins000.exe
Asegrate tambin que cuando lo instales tengas derechos de Administrador o el Servidor
no se iniciar cuando la instalacin sea completada.

COMO INSTALAR FIREBIRD SILENCIOSAMENTE


Para instalarlo sin intervencin manual, hay que hacerlo con alguna de estas opciones:
1. /SILENT
Muestra solamente la barra de progreso y el prompt
2. /VERYSILENT No muestra la barra de progreso
3. /SPNo muestra el prompt
INSTALACIN DEL FIREBIRD
Cuando instalo el Firebird me pregunta si deseo instalar las herramientas administrativas
Cules son esas herramientas, para qu sirven y dnde se encuentran?
Esas son las herramientas que se usan en la lnea de comandos (ISQL.EXE, GBAK.EXE,
GFIX.EXE, etc.)
Se encuentran en la subcarpeta \BIN de donde se instal el Firebird, por ejemplo podran
encontrarse en: C:\Archivos de Programa\Firebird\Firebird_2_5\bin
Cada una de esas herramientas cumple con una tarea especfica (ejecutar comandos SQL,
crear y restaurar backups, corregir errores en las Bases de Datos, etc.)
INSTALANDO FIREBIRD EN WINDOWS VISTA Y WINDOWS SEVEN
Cuando se lo instala en alguno de estos SO la opcin Instalar el Applet del Panel de
Control? no debe estar seleccionada porque crea conflictos.
En el caso que eso haya ocurrido entonces lo mejor es desinstalar el Firebird y volver a
instalarlo aunque ahora sin instalar el applet.
Para desinstalar el Firebird se puede ejecutar el programa:
C:\Archivos de Programa\Firebird\Firebird_2_5\unins000.exe
COMO LIBERAR EL PUERTO 3050 EN EL FIREWALL DE WINDOWS 7
La respuesta en el siguiente enlace:
http://www.digisat.com.br/ftp/manuais/Manual_Porta_3050_Windows7.pdf

FIREBIRD INTEGRADO (EMBEDDED)


Por qu necesito renombrar el archivo fbembed.dll cundo deseo usar el Firebird integrado?
Porque el Firebird espera encontrar un archivo que se llame fbclient.dll, por eso debes
renombrarlo. En versiones antiguas esperaba el nombre gds32.dll pero ese ya no se usa, el que se
usa actualmente es fbclient.dll
CLAVE PRIMARIA
La Clave Primaria debe ser independiente de los datos, no debe tener significado como
dato, debe servir solamente como Clave Primaria y nada ms. Debe ser creada usando un
generador. Si es necesario que el usuario digite un cdigo entonces la tabla tendr dos columnas:
IDENTIFICADOR y CDIGO. El Cdigo puede ser introducido manualmente por el usuario o
calculado como UltimoCdigo + 1.
PROCEDIMIENTOS ALMACENADOS
Se pueden hallar los nombres y otros datos de todos los parmetros de los procedimientos
almacenados con la siguiente sentencia:
SELECT * FROM RDB$PROCEDURE_PARAMETERS ORDER BY
RDB$PARAMETER_NUMBER;
Se pueden buscar los valores por defecto que tienen los parmetros usando las columnas
RDB$DEFAULT_VALUE y RDB$DEFAULT_SOURCE
CONFIGURANDO EL FIREBIRD
Para acelerar la conexin entre las computadoras Clientes y el Servidor se debe crear y
configurar un archivo llamado HOSTS en las computadoras Clientes. Este archivo debe
encontrarse en la carpeta WINNT (en Windows) o en /etc (en Linux).
La estructura es Nmero_de_IP
Nombre_del_Servidor, como en el ejemplo:
192.168.1.
MiServidor
COMO CONVERTIR UNA BASE DE DATOS DE UN CHARSET A OTRO
1. Extraer un script con los metadatos
2. Editar el script con el Block de Notas
3. Reemplazar todas las referencias al Charset antiguo por el Charset nuevo
4. Con ese script crear una nueva Base de Datos (ahora con el Charset nuevo)
5. Usar el IBDataPump para migrar los datos de la Base de Datos antigua a la nueva
6. Verificar que se especifiquen los charsets correctos para ambas Bases de Datos
COMO DESACTIVAR LOS NDICES DE LAS PRIMARY KEYS (PK)
1. Para desactivar el ndice:
UPDATE RDB$INDICES
SET RDB$INDEX_INACTIVE = 3

WHERE RDB$INDEX_NAE = 'Nombre del ndice'


2. Para reactivar el ndice:
UPDATE RDB$INDICES
SET RDB$INDEX_INACTIVE = 0
WHERE RDB$INDEX_NAME = 'Nombre del ndice'
COMO MAXIMIZAR LA DISPONIBILIDAD DEL SERVIDOR
1. Tener un hardware de calidad (nada de productos chinos baratos)
2. Dimensionarlo de acuerdo a la carga que se pretende tener (nmero de terminales con
acceso simultneo, cantidad de informacin, etc.)
a. Los mejores discos duros son los que tienen una alta tasa de transferencia de
datos
b. Comprar los que tengan tecnologa de prevencin de errores (SMART, p.e.)
c. Cuanto mayor sean las RPM del motor, mejor
d. Un RAID 10 es una muy buena opcin
3. Para monitorear la Base de Datos usar el programa FBDataGuard
COMO OBTENER INFORMACIN DE LAS TABLAS DE UNA BASE DE DATOS
select rdb$relation_fields.rdb$relation_name table_name,
rdb$relation_fields.rdb$field_name field_name,
case
when rdb$types.rdb$type_name = 'VARYING' then 'VARCHAR'
else rdb$types.rdb$type_name
end field_type,
rdb$fields.rdb$field_length field_size
from rdb$relation_fields
join rdb$fields
on rdb$fields.rdb$field_name =
rdb$relation_fields.rdb$field_source
join rdb$types
on rdb$fields.rdb$field_type = rdb$types.rdb$type and
rdb$types.rdb$field_name = 'RDB$FIELD_TYPE'
where substring(rdb$relation_fields.rdb$relation_name from 1 for 4) <>
'RDB$'
order by rdb$relation_fields.rdb$relation_name
COMO OBTENER LA FECHA Y LA HORA DEL SERVIDOR
SELECT CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME
FROM RDB$DATABASE
COMO OBTENER LA INFORMACIN DE UNA TABLA USANDO SELECT
SELECT DISTINCT
A.RDB$FIELD_POSITION AS ORDER_ID,
A.RDB$FIELD_NAME AS F_NAME,
B.RDB$FIELD_TYPE,

B.RDB$FIELD_SCALE,
CASE
WHEN B.RDB$FIELD_PRECISION > 0 THEN
'NUMERIC('||CAST(B.RDB$FIELD_PRECISION AS
VARCHAR(2))||','||CAST(B.RDB$FIELD_SCALE*-1 AS VARCHAR(2))||')'
WHEN C.RDB$TYPE_NAME='LONG' THEN 'INTEGER'
WHEN C.RDB$TYPE_NAME='SHORT' THEN 'SMALLINT'
WHEN C.RDB$TYPE_NAME='VARYING' THEN
'VARCHAR('||B.RDB$CHARACTER_LENGTH||')'
WHEN C.RDB$TYPE_NAME='TEXT' THEN
'CHAR('||B.RDB$CHARACTER_LENGTH||')'
WHEN C.RDB$TYPE_NAME='BLOB' THEN 'BLOB SUB_TYPE
'||CAST(B.RDB$FIELD_SUB_TYPE AS CHAR(1))
ELSE
C.RDB$TYPE_NAME
END AS F_TIPO,
CASE
WHEN A.RDB$NULL_FLAG IS NULL THEN ''
ELSE
'NOT NULL'
END AS F_NULL,
F.RDB$FIELD_NAME AS F_PRIMARY
FROM
RDB$RELATION_FIELDS
A
LEFT JOIN RDB$FIELDS
B ON A.RDB$FIELD_SOURCE=B.RDB$FIELD_NAME
LEFT JOIN RDB$TYPES
C ON C.RDB$FIELD_NAME='RDB$FIELD_TYPE' AND
B.RDB$FIELD_TYPE=C.RDB$TYPE
LEFT JOIN RDB$RELATION_CONSTRAINTS
E ON A.RDB$RELATION_NAME=E.RDB$RELATION_NAME AND
E.RDB$CONSTRAINT_TYPE='PRIMARY KEY'
LEFT JOIN RDB$INDEX_SEGMENTS
F ON E.RDB$INDEX_NAME=F.RDB$INDEX_NAME AND
A.RDB$FIELD_NAME=F.RDB$FIELD_NAME
WHERE
A.RDB$RELATION_NAME = 'SUA_TABELA'
COMO OBTENER LOS TIPOS DE DATOS SOPORTADOS POR EL FIREBIRD
SELECT RDB$TYPE, RDB$TYPE_NAME
FROM RDB$TYPES WHERE RDB$FIELD_NAME = 'RDB$FIELD_TYPE'
COMO REPARAR UNA BASE DE DATOS
1. Detener el Servidor del Firebird. Esto es muy importante porque aunque ningn
usuario est accediendo a la BD el Servidor puede estar realizando alguna tarea
interna y si no se lo detiene eso puede conducir a ms corrupcin.
2. Hacer una copia de seguridad de la BD.

3. Verificar que la Base de Datos realmente tiene problemas:


GFIX c full MiBase.FDB
4. En caso de tenerlos, intentar recuperarlos:
GFIX mend full ignore MiBase.FDB
5. Verificar que haya sido reparada:
GFIX c full MiBase.FDB
6. Si an tiene problemas:
GBAK backup v ignore MiBase.FDB MiBase.FBK
7. Si se encontr algn error:
GBAK backup v ignore garbage MiBase.FDB MiBase.FBK
8. Si se encontr algn error:
GBAK backup v ignore garbage limbo MiBase.FDB MiBase.FBK
9. Si an existe algn error entonces el problema es muy grave y deberas contactar con
alguna empresa especializada en restaurar Bases de Datos
Si se consigui hacer el backup de la Base de Datos:
GBAK create v MiBase.FBK MiBase.FDB
Si ocurri algn error durante la restauracin:
Usar los parmetros inactive y one_at_a_time
COMO SABER SI UNA TABLA EXISTE EN LA BASE DE DATOS
SELECT COUNT(RDB$Relation_Name) FROM RDB$Relation_Fields
WHERE RDB$Relation_Name = NombreMiTabla
OPTIMIZANDO LOS NDICES
De vez en cuando (quizs una vez por semana) hay que actualizar las estadsticas de los
ndices asociados a tablas que sufren constantes actualizaciones de datos. Eso se hace con:
SET STATISTICS
La razn es que el Firebird utiliza esas estadsticas para determinar cual ndice elegir
durante una consulta y si las estadsticas estn desactualizadas entonces puede elegir un ndice
que no sea el ms correcto.
REALIZANDO BACKUPS
Es preferible usar GBAK.EXE antes que NBACKUP.EXE, la razn es que NBACKUP es
ms rpido pero no verifica el contenido de las pginas. Se puede usar NBACKUP pero slo si
se realizan frecuentes sweeps y se monitorea frecuentemente los marcadores de las transacciones
(ultima transaccin activa, ltima transaccin interesante, etc.)
USANDO SHADOWS
No se recomienda usar shadows en estos momentos porque solamente sirven para
recuperar la Base de Datos en el caso de que el disco duro sea daado. Mucho ms rpido y
conveniente para mantenimiento es usar RAID5 o RAID10.

RECREANDO LOS NDICES


Si la Base de Datos tiene bastante movimiento, se recomienda que de vez en cuando
(quizs una vez cada 15 das) se recalculen las estadsticas de los ndices, para que el
optimizador tenga valores actuales con los cuales trabajar.
Al recalcular las estadsticas, con el comando SET STATISTICS automticamente se
reconstruyen los ndices.
CONEXIN A UNA BASE DE DATOS CON PHP
La conexin de PHP con Interbase. Lo primero que hay que hacer es realizar la conexin, por
medio del comando PHP:
ibase_pconnect("base_de_datos.gdb", "USUARIO", "contrasea");
donde el primer parmetro es la ruta completa hacia la base de datos, por ejemplo, si
estamos utilizando Linux, podra ser algo as:
/opt/interbase/bases/mi_base.gdb
o si usramos Windows, podra ser algo as:
c:basesmi_base.gdb
El segundo parmetro se refiere al usuario. Es cierto, se puede utilizar SYSDBA,
aunque siempre recomiendo crear otro usuario y asignarle permisos a la tabla que
vamos a acceder, esto es porque en el tercer parmetro debemos de especificar la
contrasea del usuario, y no conviene mostrar la contrasea del administrador del
sistema (SYSDBA).
No olvides asignar permisos al usuario mediante una orden como esta, suponiendo que
el usuario se llama USU_PHP:
GRANT ALL ON TABLAX TO USU_PHP
donde TABLAX es cualquier tabla que vamos a acceder desde el programa PHP.
De esta manera, un ejemplo de conexin quedara as:
ibase_pconnect("/opt/interbase/bases/mi_base.gdb", "USU_PHP", "usu0189xf");
Aqu hay que tomar en cuenta esto:
a) Si usas Linux, y usas la versin Classic Server, entonces puedes
crear las bases de datos en cualquier directorio, slo que debes darle
todos los permisos al archivo con el comando chmod de Linux.
b) Si usas Linux y usas Super Server, entonces la base de datos la
debes crear en un directorio que tenga permisos para el usuario InterBase.

Cmo ejecutar SQL


Para ejecutar una instruccin SQL, primero debers haber ejecutado la instruccin
ibase_pconnect que se mencion antes.
La ejecucin de una instruccin SQL se hace con la funcin ibase_query, la cual debes
asignar a una variable de PHP:
$Q = ibase_query("SELECT * FROM TABLAX");
tambin puedes ejecutar SQL para insertar, modificar o eliminar:
$Q = ibase_query("INSERT INTO TABLAX(CAMPO1, CAMPO2) VALUES
('$valor1', '$valor2');");
Obviamente la diferencia es que una instruccin SELECT nos devolver datos de la
tabla, mientras que otra instruccin SQL no lo har (como INSERT, DELETE o
UPDATE).
Para obtener los registros resultantes de una consulta con SELECT, utilizaremos esta
instruccin:
$R = ibase_fetch_object($Q);
como se ve, $Q es la variable que se utiliz en la instruccin ibase_query. Cada vez que
se ejecuta la instruccin anterior, se va obteniendo un registro de la consulta. Para
obtener todos los registros de la consulta, hay que insertarlo en una instruccin while:
while ($R = ibase_fetch_object($Q)) {
echo $R->CAMPO1 . "
";
}
Aqu se observan varias cosas: primero, que el ciclo se ejecutar hasta llegar al ltimo
registro, nicamente ejecutando varias veces el comando ibase_fetch_object. Tambin
hay que poner atencin en que el nombre del campo vaya con maysculas, ya que si se
escribe con minsculas no va a funcionar.

La instruccin echo enva la expresin a la salida, en este caso la salida es enviada al


cliente (navegador web que solicit la pgina). El punto significa concatenacin y la
cadena "
" sirve para que el navegador lo interprete como un cambio de lnea.
Otra aclaracin: cuando se ejecute una instruccin de SQL que no sea de consulta (que
no sea SELECT), conviene ejecutar la instruccin ibase_commit() para aplicar la
transaccin y de esta manera se asegure que los cambios fueron efectuados.

Un Ejemplo
Para finalizar, har un pequeo ejemplo de cmo crear una pgina web. Tomar como
referencia la tabla personas que se cre en el artculo Pasando de Paradox a InterBase,
parte 2. Esta es la estructura de la tabla:
CREATE TABLE PERSONAS(
CLAVEPERSONA INTEGER NOT NULL,
NOMBRE VARCHAR(40),
APELLIDOS VARCHAR(40),
TELEFONO VARCHAR(40),
EMAIL VARCHAR(100),
PRIMARY KEY(CLAVEPERSONA)
)

Entonces para desplegar esta tabla crearemos un archivo HTML con cdigo integrado
de PHP:
<HTML>
<HEAD></HEAD>
<BODY>
<?php
ibase_pconnect("/opt/interbase/bases/mi_base.gdb", "USU_PHP",
"usu0189xf");
echo "<TABLE WIDTH="100%" BORDER="1">;
$Q = ibase_query("SELECT * FROM PERSONAS;");
while ($R = ibase_fetch_object($Q)) {
echo "<TR><TD>" . $R->CLAVEPERSONA . "</TD>n";
echo "<TD>" . $R->NOMBRE . "</TD>n";
echo "<TD>" . $R->APELLIDOS . "</TD></TR>n";
}
echo "</TABLE>";
?>
</BODY>
</HTML>

S que este artculo es bastante corto y no cubre algunos aspectos bsicos como
instalacin de PHP con Windows o con Linux y activar el soporte a InterBase, pero
tambin estoy consciente que cuando menos ayudar a algunas personas que ya conocen
PHP a utilizar las ventajas de InterBase en esta plataforma de desarrollo tan popular,
como PHP.

COMO CONECTARSE A UNA BASE DE DATOS FIREBIRD DESDE PHP


Hola amigos, este tema lo traigo desde mi BLOG, debido a que como paso la mayor
parte de mi tiempo en el foro y es un tema muy visitado tambin, para que no se pierda
la coloco aqu
, empecemos.
En este breve tuto les ensear como conectar una base de datos Firebird desde PHP,
como es una de las bases ms populares del momento es justo tambin aprender a
conectarse desde otro lenguaje que no sea Delphi (VB?, Guacala!). En este tutorial
vamos a tratar con un servidor local, para los que no tienen Apache y PHP y no tienen
mucho conocimientos para la instalacin de las mismas, pueden descargarse un pack
con todo incluido e instalacin automtica, la cual recomiendo ampliamente AppServ.
Luego de instalar el servidor, procedemos a detener el servicio Apache antes de hacer
cualquier modificacin, luego localizar el archivo PHP.INI (recuerda realizar un backup
de este archivo antes de.. ) ubicado en la carpeta WINDOWS, lo abrimos y buscamos
la lnea php_interbase.dll y le quitamos el punto y coma ; que tiene delante y as
activamos esa extensin. Lo siguiente que haremos es buscar la lnea extension_dir y le
cambiamos su valor a:
Citar
extension_dir=c:\AppServ\php-5\ext\
Nota: deben colocar la carpeta de PHP correcta de acuerdo a la versin de AppServ
descargada.
Y por ltimo buscamos la lnea session.save_path, Pero antes debemos crear una
carpeta temporal en el directorio de Apache ubicado en C:\AppServ, en este caso he
creado una carpeta llamada tmp, quitamos el ";" en caso de tenerlo y cambiamos la lnea
as:
Citar
session.save_path=c:\AppServ\Apache2\tmp
y eso es todo, grabamos y reiniciamos Apache y luego reiniciamos la pc para que los
cambios hagan efectos con ms efectividad. Luego de reiniciado la PC, procedemos a
revisar si se realizaron los cambios correctamente abriendo el navegador web de su
preferencia (en mi caso Firefox, IE? Guacala!
), y ponemos la direccin
http://Localhost/phpinfo.php, y vas a ver la configuracin completa de PHP, ms abajo
debe aparecer la configuracin de Interbase, si les aparece pues todo est instalado
correctamente.

Conectarse a Firebird
Ahora vamos a proceder a conectarnos a Firebird desde PHP.
Cdigo para conectar a la base:
Cdigo:
$conn=ibase_connect("localhost:C:\\AppServ\\www\\fdb\\MUSICA.FDB",
"SYSDBA", "masterkey");
if (!$conn)
{ echo "Acceso Denegado!";
exit; }

El anterior cdigo creo que es bastante claro, Localhost es el host seguido de la


ubicacin de la base de datos, SYSDBA es el user y masterkey la contrasea.
Ahora les har un ejemplo completo con un query y mostrar los resultados en una tabla:

Cdigo:

<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN


http://www.w3.org/TR/html4/loose.dtd>
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv=Content-Type content=text/html; charset=iso8859-1?>
</head>
<body>
<?php
$conn=ibase_connect("localhost:C:\\AppServ\\www\\fdb\\MUSICA.FDB",
"SYSDBA", "masterkey");
if (!$conn)
{ echo "Acceso Denegado!";
exit; }
$query="select ARTISTA from ARTISTAS;";
$result=ibase_query($conn,$query);
if (!$result) {
echo "no se puede mostrar datos desde la consulta: $query!";
exit;
}
$row=ibase_fetch_object($result);
while ($row = ibase_fetch_object ($result)) { ?>
<table width="200" border="1">
<tr>
<td><? echo "$row->ARTISTA"; ?></td>
</tr>
</table>
<? } ?>
<p>&nbsp;</p>
</body>
</html>

IMPORTANTE: En el navegador hay que escribir: http://localhost/index.php


porque si se escribe algo como: file:///c:/carpeta/tuacrhivo.php, no funcionar.
INSTALAR XAMPP
El mejor programa de tipo WAMP (Windows, Apache, MySQL, PHP) es
XAMPP, porque es el ms completo de todos.

COMO USAR FIREBIRD EMBEBIDO EN LINUX


Hola a todos, en esta ocasion traigo un tutorial para los amantes de Linux, instalar
Firebird embebido en LINUX.
Como muchos sabran Firebird viene en 2 sabores: SuperServer y ClassicServer, solo
este ultimo se puede utilizar como embebido, en este tutorial vamos a trabajar con
FirebirdCS-2.5.0.26074-0.i686 ClassicServer, Empecemos:
Paso 1: Descargar la version linux (x86 o x64) en formato .tar.gz
Desde la web de Firebird deberan descargar la version Linux dependiendo del tipo de
maquina que utilizas, ya sea de 32Bits (x86) o de 64Bits (x64) en el formato tar.gz,
porque es mas facil de descomprimir.
Paso 2: Descomprimir y copiar
Luego de descargar el archivo correspondiente, adentro veras otro archivo comprimido
llamado buildroot.tar.gz la cual extraemos su contenido en cualquier sitio de tu
preferencia, luego copiaremos los siguientes archivos en una carpeta nueva en otro lado
llamado fbembed:
Cdigo:

bin/fb_lock_print
bin/isql
intl/fbintl
intl/fbintl.conf
firebird.msg
libfbembed.so
libfbembed.so.2.5
libfbembed.so.2.5.0
security2.fdb

Luego de copiar esos archivos en la carpeta mencionada anteriormente, algo como (en
mi caso):
Cdigo:
root@slax:~# cd /root/Desktop/fbembed

Copiaremos esa carpeta en la carpeta donde guardamos nuestra aplicacion, en mi caso


estoy haciendo un Sistema de Carambolas, me queda asi:
Cdigo:

root@slax:~# cd /root/Desktop/Sistema\ Carambolas/fbembed

Ahora debemos crear un archivo firebird.conf para indicar la ubicacion del fbembed
donde se creara la BD y agregamos las siguientes lineas:

Indicamos la ruta de fbembed:

Cdigo:

RootDirectory = /root/Desktop/Sistema Carambolas/fbembed

Configuramos algunas variables de entornos:


Cdigo:
export LD_LIBRARY_PATH=/root/Desktop/Sistema Carambolas/fbembed
export FIREBIRD=/root/Desktop/Sistema Carambolas/fbembed

Y eso es todo, ya tenemos nuestro firebird embebido funcionando.


Paso 3: Creando una Base de Datos
Primero debemos abrir nuestra consola de comandos y ejecutar ISQL, primero debemos
posicionarnos en la carpeta fbembed de nuestro proyecto y ejecutarla, en mi caso seria
asi:
Cdigo:
root@slax:~/Desktop/Sistema Carambolas/fbembed#

Aqui estoy posicionado en la carpeta fbembed de mi proyecto, ahora debo ejecutar la


consola ISQL de Firebird:
Cdigo:

root@slax:~/Desktop/Sistema Carambolas/fbembed# bin/isql


Use CONNECT or CREATE DATABASE to specify a database
SQL>

ya estamos dentro de la consola de Firebird, ahora procedemos a crear una BD:


Cdigo:
SQL> create database 'prueba.fdb' page_size 8192
CON> user 'SYSDBA' password 'masterkey';

Ahora para verificar que se creo correctamente tecleamos el siguiente comando:


Cdigo: SQL> select * from RDB$RELATIONS;
Eso es todo amigos, luego traere otro tuto de como conectarnos con Firebird y Lazarus
en Linux.
Un Saludo y que lo disfruten

RAZONES PARA CREAR LAS BASES DE DATOS CON OTRO USUARIO (NO CON
SYSDBA)
Las Bases de Datos y los metadatos (dominios, tablas, procedimientos almacenados,
desencadenantes, etc.) no deben ser creados por el usuario SYSDBA sino por otro usuario, ya
que no siempre se podr conocer la contrasea de SYSDBA.
COMO CONOCER LA VERSIN DEL SERVIDOR
Para conocer cual es la versin del Servidor, se debe escribir esta consulta:
SELECT RDB$GET_CONTEXT(SYSTEM, ENGINE_VERSION) FROM
RDB$DATABASE
FECHAS DE SALIDA DE CADA VERSIN DEL FIREBIRD
Poner una tabla con la fecha en la cual se liber cada versin del Firebird y tambin lo que se le
fue agregando o mejorando.
HAMACHI
Para que funcione la conexin con Hamachi el firewall tiene que estar desactivado.
CONNECT 5.20.83.86:ERP USER WALTER PASSWORD 123456

funciona OK

PROBLEMAS PARA ESTABLECER LA CONEXIN


Si una computadora Cliente no puede conectarse con el Servidor, muy probablemente el causante
del problema sea el firewall de una (o de ambas) computadora/s.
CUIDADOS Y MANTENIMIENTOS DE LA BASE DE DATOS
Hacer un backup diariamente, con la BD accesible a los usuarios
Una vez a la semana, restaurar el ltimo backup de la BD en otra computadora, para
asegurar que el backup est en buenas condiciones y puede ser restaurado. Si se pudo
restaurar sin errores, significa que el backup est bien. La restauracin debe efectuarse
solamente si la BD tiene problemas, no se justifica hacerla por hacerla.
No se justifica reemplazar la BD que est siendo usada actualmente mediante el ciclo de:
o Desconectar a todos los usuarios
o Hacer el backup
o Restaurar el backup
o Reconectar a los usuarios
A menos que se haya detectado algn problema en la BD.
Cada vez que se hace un backup se realiza la recoleccin de basura, por lo tanto
mediante un backup diario se asegura que la BD est limpia
Una vez al da en aplicaciones que cargan datos muy intensivamente (ms de 10.000
nuevas filas por da) o una vez a la semana en los dems casos se debe resetear la
selectividad de los ndices para que stos tengan la mxima eficiencia.
Una vez a la semana, se debe ejecutar GSTAT h y mirar los contadores de las
transacciones. Si la diferencia entre ellos es grande eso implica que los programas no
estn cerrando correctamente las transacciones. Eso es un error que debe ser solucionado,
se debe buscar el programa que deja tantas transacciones abiertas.
Una vez a la semana se debe realizar un SWEEP

Cuando el nmero de la transaccin se acerca al lmite (2 ^ 32 1) hay que hacer un ciclo


de backup/restore para que el nmero de transaccin vuelva a cero.
COMO INSTALAR FIREBIRD DOS VECES EN LA MISMA COMPUTADORA
A veces necesitamos que dos (o ms) versiones de Firebird convivan en la misma
computadora. O la misma versin, pero duplicada o triplicada.
Por ejemplo, sera el caso si vamos a instalar nuestra aplicacin en la computadora de un
cliente y descubrimos que ya tiene instalado el Firebird y que est siendo usado por otro
programa, de la competencia. Claro, podramos desinstalar el Firebird que ya tiene e instalar el
nuestro pero eso sera muy poco profesional porque el otro programa dejar de funcionar.
Tambin podra ocurrir que la versin que tiene instalada (por ejemplo, la 2.5.1) es la que
nosotros necesitamos, pero no conocemos la contrasea de SYSDBA porque ha sido cambiada y
necesitamos conocerla.
Para estos casos, la solucin es que instalemos nuestro Firebird sin interferir con el (o los)
Firebird ya instalado/s.
Por defecto, la comunicacin entre el Servidor y el Cliente de Firebird se realiza a travs
del puerto 3050, pero eso es configurable, podemos usar cualquier puerto que se nos ocurra. Los
nmeros de puerto van entre 0 y 65535, los primeros 1024 son para uso del Sistema Operativo y
por lo tanto estn reservados y sera muy mala idea utilizarlos porque podramos interferir con
algo importante. Sin embargo, los puertos desde el 1025 hasta el 65535 estn libres y a nuestra
disposicin.
Bueno, en realidad no es tanto as, ya que muchos de esos puertos son utilizados por
algunos programas. Por ejemplo, por defecto el Firebird utiliza el puerto 3050, si otro programa
quisiera usar ese mismo puerto entonces crear un conflicto y uno o ambos no funcionar o lo
har con errores.
Resumiendo: qu debemos hacer para instalar el Firebird en una computadora que ya lo
tiene instalado?

Detener la instancia actual del Firebird


Descargar e instalar el instalador .ZIP, no el .EXE
Instalar nuestra versin en otra carpeta
Asignarle un nmero de puerto que est libre (o sea que no est siendo usado)

HACIENDO BACKUP CON GBAK


La Base de Datos que se quiere copiar debe estar accesible segn su nombre completo o
segn su alias. Por ejemplo:
GBAK backup user WALTER password 123456 localhost/33051:ERP MiBackup.fbk

OBTENIENDO UNA BASE DE DATOS VACA, COPIA DE OTRA


Si quieres tener una Base de Datos vaca, pero que sea la copia exacta de los metadatos de
otra base de datos:
GBAK m MiBaseDatos.FDB MiBackupVacio.FBK
GBAK c MiBackupVacio.FBK MiBaseDatosVacia.FDB

Si ya se tena un backup, se puede acortar escribiendo:

GBAK c m MiBackup.FBK MiBaseDatosVacia.FDB

CMO SOLUCIONAR EL PROBLEMA DE QUE UN BACKUP RESTAURADO


SOLAMENTE ACEPTA UNA CONEXIN?
Si haces un backup con una versin del Firebird y lo restauras con otra versin puede
aparecerte el mensaje: Database <nombre de la Base de Datos> shutdown cuando intentas
conectarte a la Base de Datos desde varias aplicaciones o computadoras.
El problema es que est en modo single de administracin y por lo tanto solamente
admite una conexin, para solucionarlo escribe:
GFIX online multi user sysdba password masterkey
127.0.0.1:MiBaseDatos.FDB

NDICES
La estadstica de los ndices solamente es calculada despus de un ciclo backup/restore o cuando
un ndice es recreado o activado.
Una estadstica de 0,5 solamente ocurre cuando hay dos valores en esa columna, por ejemplo 0 y
1, S y N, esto es malsimo en trminos de performance.
Cuanto ms cerca est de cero la estadstica, mucho mejor. Cuanto mayor es el valor, es peor.

COMO LIBERAR UN PUERTO DEL FIREBIRD EN EL FIREWALL DE WINDOWS


Se voc quer liberar o Firebird (usando a porta padro 3050) no Firewall do Windows
Vista ou 2008, direto na linha de comando, pode usar a seguinte instruo:
netsh advfirewall firewall add rule name="Firebird" dir=in
action=allow protocol=TCP localport=3050

Para o XP, o comando :


netsh firewall add portopening protocol=TCP port=3050 name="Firebird"
mode=ENABLE scope=SUBNET

Caso seu Firebird esteja rodando em uma porta diferente da padro, basta adaptar o
comando para a porta desejada.
Dica enviada por Daniel Pereira Guimares

TRANSACCIONES
OK, time for my lecture on OAT and OIT.
The OIT is the oldest transaction in the system that did not commit usually a transaction that failed but could not roll itself back. They're
more common in Classic that SuperServer because the latter rolls back
transactions after a normal failure. But if one of the client processes is
killed, it will leave all its transactions marked as rolled back. There
are only two ways to increase the OIT. Backup/restore or sweep. The good
news is that an old, stuck OIT doesn't matter much at all. A very long
time ago when we could only dream of have a gig of disk (and not even
imaging a whole gig of memory), keeping a list of the states of old
transactions (at two bits per transaction) between the OIT and current
transaction was a problem. It's not any more.
So don't worry about the difference between the OIT and next, or if you
must worry, run a sweep from time to time.
The OAT is the oldest transaction that the system considers to be active.
It blocks garbage collection and induces database bloat. Transactions
that commit using "commit retaining" do not advance the OAT. Transactions
that are left open for hours - even transactions that have not changed
the database - leave the OAT stuck. Once the OAT is stuck, Firebird must
keep old versions of records that transaction might read if it ever wakes
up and starts working again.
Do worry about a stuck OAT. Use the MON$ tables to identify it and stop it.
Good luck,
Ann
TIPOS DE TRANSACCIONES
SNAPSHOT. Si una transaccin es de este tipo entonces ve a la Base de Datos como estaba en el
momento de iniciarse la transaccin, todos los cambios que ocurran posteriormente en la Base de
Datos (inserciones, borrados, modificaciones) son invisibles para la transaccin de tipo Snapshot,
como si no existieran.
READ COMMITED, Si una transaccin es de este tipo entonces todos los cambios que hayan
ocurrido despus de que inici y que hayan sido commited sern visibles. O sea, si una
transaccin es Read Commited puede ver a todas las transacciones que fueron commit
despus que ella inici.
Snapshot Ve solamente las transacciones que fueron commit antes de que empezara

Read Commited Ve las transacciones que fueron commit antes y despus que empezara
If I access a table in a firebird database from excel using ODBC is that table
automatically in a locked state until i quit Excel?
No. Firebird doesn't lock tables the way you are used to with Access, for example. Firebird
employs what is known as "optimistic locking", whose exact behaviour is determined by the way
the enclosing transaction is configured.
What you will have is a transaction started through the ODBC interface. The isolation level of
that transaction determines how stable your application's view will remain throughout the
transaction and the behaviour when two or more transactions want to modify the same row.
SNAPSHOT isolation (which I think is the default for the Firebird ODBC driver) means that
Excel continues to see the set as it was at the start of the transaction. READ COMMITTED
isolation means that Excel can refresh the set to get an updated view of what other transactions
have committed since its own transaction started.
If another transaction has a pending update on a row in the set that Excel is viewing, a lock
conflict occurs and Excel won't be able to update that row. If Excel has an update pending on a
row in that set, other transactions won't be able to update that row.
./hb

COMO EJECUTAR EL BACKUP EN UN EQUIPO REMOTO


"C:\Arquivos de programas\Firebird\Firebird_2_1\Bin\gbak.exe" -b -v -user
sysdba -password masterkey 192.168.0.1/3051:C:\sistema\dados\DADOS.FDB
d:\Backup\systema\dados\dados.fbk
El nombre del usuario y la contrasea deben ser los del equipo remoto.

CONEXIN A LA BASE DE DATOS


se o banco de dados multiusurio, ento a string de conexo precisa ser
"IP do servidor:local e nome do banco de dados"
por exemplo: 192.168.1.100:D:\SISTEMAS\BASEDATOS.FDB
todos os pc's clientes precisam ter acesso ao servidor (192.168.1.100)
preferencialmente o IP de cada pc cliente deve estar no dominio
192.168.1.XXX
a pasta D:\SISTEMAS no precisa estar compartilhada
a porta 3050 deve estar liberada no firewall do servidor
localhost ou 127.0.0.1 s usado para banco monousurio
CMO BORRAR TODAS LAS CLAVES FORNEAS
EXECUTE BLOCK RETURNS (stmt VARCHAR(1000)) AS
BEGIN
FOR
select 'alter table '||r.rdb$relation_name ||' drop constraint
'||r.rdb$constraint_name||';'
from rdb$relation_constraints r
where (r.rdb$constraint_type='FOREIGN KEY')
into :stmt
DO
begin
suspend;
execute statement :stmt;
end
END

COMO SABER CUALES TABLAS TIENEN UNA COLUMNA


A veces no recordamos cuales tablas tiene una columna. Por ejemplo, la columna email
cules son las tablas que tienen esa columna?
SELECT
R.rdb$relation_name,
RF.rdb$field_name
FROM
rdb$relations R
JOIN
rdb$relation_fields RF
ON R.rdb$relation_name = RF.rdb$relation_name
WHERE
RF.rdb$field_name CONTAINING 'EMAIL'

PUEDO TENER UNA BASE DE DATOS DE FIREBIRD EN UN DISCO


COMPARTIDO?
No, nunca. La Base de Datos siempre debe estar en la misma computadora que el
Servidor. (Helen Borrie dixit)
PUEDO TENER A VARIOS USUARIOS ACCEDIENDO A LA VERSIN EMBEDDED
DEL FIREBIRD?
No. (Helen Borrie dixit)
BACKUP DE UNA BASE DE DATOS
1. ALTER DATABASE BEGIN BACKUP
2. Realizar la copia con algn programa externo (WinZip, WinRar, el Explorador del
Windows, etc.)
3. ALTER DATABASE END BACKUP
A pesar de lo que parece por la sintaxis BEGIN BACKUP no inicia el backup sino que
permite que la Base de Datos sea copiada. Mientras est siendo copiada todos los cambios
(inserciones, borrados, modificaciones) sern grabados en un archivo delta. As mismo END
BACKUP no finaliza el backup sino que vuelve la Base de Datos a su estado normal y le agrega
todas las modificaciones que se encuentran en el archivo delta.
Por ningn motivo copies una Base de Datos sin seguir los pasos anteriores cuando est
en ejecucin (algn usuario la tiene abierta) u obtendrs una Base de Datos daada.

COMO REPARAR UNA BASE DE DATOS CORRUPTA

How to repair a corrupt Firebird database?


Here's a short step-by-step walkthrough:
* disconnect users and disable incoming connections to the database (FAQ #64)
* make a copy of database file (or two copies) and work on that
* use GFIX with -v option to validate the database file
* use GFIX with -v and -f to do full validation
If problem is not too serious, you can try to backup the broken db and restore under a
new name:
* use GFIX -mend to prepare corrupt database for backup
* use GBAK -b -g to backup the database. -g disables garbage collection (FAQ #41)
* use GBAK -c to restore backup to a new database.

If you succeed, you have fixed the problem and have a functional database. If not, you
can try to create an empty database with the same structure and pump the data to it (see
FAQ #20).
One of the reasons why backup or restore can fail is if some broken database triggers
exist, and prevent connection to the database. For example, a database trigger might use
some table which has a broken index, etc. To work around this, connect to database with
isql tool using -nodbtriggers option and then disable those triggers. You can enable them
later when you fix other problems and get a working database again.
Another reason restore might fail is when you have broken data, so some of validity
constraints (check constraints, etc.) cannot be satisfied. In this case, you can try to
restore your database using -N[O_VALIDITY] command switch to gbak.
If you're interested in a more detailed information of the process of fixing the database,
as well as explanation of some types of corruption, take a look at the following page:
http://www.ibphoenix.com/resources/documents/search/doc_5
If all fails, you can try IBSurgeon tool, which is able to fix most problems and extract
data. Also, IBSurgeon's website has a detailed
explanation of causes of database corruption and ways to fix it:
http://ib-aid.com/option,com_content/task,view/id,58/Itemid,62/
CUAL VERSIN DEL FIREBIRD INSTALAR, 32 BITS 64 BITS?
En el Servidor la versin debe corresponder a la CPU. Eso significa que si la CPU es de
32 bits entonces se debe instalar el Firebird Server de 32 bits. Y si la CPU es de 64 bits entonces
se debe instalar el Firebird Server de 64 bits.
En cuanto a los clientes: si las aplicaciones estn compiladas en 32 bits entonces se debe
usar el cliente de 32 bits en todas las computadoras. Y si las aplicaciones estn compiladas en 64
bits entonces se debe usar el cliente de 64 bits en todas las computadoras.
Versin del Server = CPU
Versin del Cliente = Compilacin de las aplicaciones

EXECUTE STATEMENT
Este comando recibe un argumento y lo ejecuta. Puede devolver resultados o no.
Ejemplo Nro 1:
SET TERM ^ ;
CREATE PROCEDURE OBTENER_NOMBRE_EMPRESA
RETURNS(
NOMEMP TYPE OF COLUMN EMPRESA.EMP_NOMBRE)
AS
DECLARE VARIABLE COMANDO VARCHAR(256);
BEGIN
COMANDO = 'SELECT EMP_NOMBRE FROM EMPRESA';
EXECUTE STATEMENT :COMANDO INTO :NOMEMP;
END^
SET TERM ; ^
Suponiendo que tenemos una tabla llamada EMPRESA que tiene una sola fila (y ninguna
ms) y dentro de esa tabla una columna llamada EMP_NOMBRE, entonces el SP de arriba nos
devolver el nombre de la Empresa. Pero solamente funcionar si la tabla tiene una sola fila.
EXECUTE PROCEDURE OBTENER_NOMBRE_EMPRESA
Ejemplo Nro 2:
SET TERM ^ ;
CREATE PROCEDURE OBTENER_DATOS_CLIENTES
RETURNS(
IDENTI TYPE OF COLUMN CLIENTES.CLI_IDENTI,
NOMCLI TYPE OF COLUMN CLIENTES.CLI_NOMBRE)
AS
DECLARE VARIABLE COMANDO VARCHAR(80);
BEGIN
COMANDO = 'SELECT CLI_IDENTI, CLI_NOMBRE FROM CLIENTES
ORDER BY CLI_CODSUC, CLI_IDENTI';
FOR EXECUTE STATEMENT :COMANDO INTO :IDENTI, :NOMCLI DO
SUSPEND;

END^
SET TERM ; ^
Cuando queremos obtener ms de una fila, debemos escribir un SP similar al de arriba, es
decir utilizando un ciclo FOR DO y el comando SUSPEND. A esta clase de SP se les llama
seleccionables.
Cada vez que se ejecuta el comando SUSPEND se devuelve una fila (y solamente una
fila) al programa que llam a este SP.
Como se trata de un SP seleccionable, para obtener las filas debemos escribir:
SELECT IDENTI, NOMCLI FROM OBTENER_DATOS_CLIENTES
STORED PROCEDURES SELECCIONABLES
Un SP es seleccionable cuando contiene una instruccin SUSPEND, y en tal caso se lo
ejecuta a travs de un SELECT.

BASES DE DATOS DAADAS


Tenta fazer isso aqui:
1 Confirme se o banco esta com problemas:
*gfix -c -full banco.fdb;*
2 Caso o erro seja confirmado, tente recuperar o banco:
*gfix -mend -full -ignore banco.fdb;*
3 Confirme se o banco foi reparado:
*gfix -c -full banco.fdb;*
4 Caso o banco ainda esteja com problema, tente:
*gbak -backup -v -ignore banco.fdb banco.fbk;*
5 Caso obtenha um erro tente:
*gbak -backup -v -ignore -garbage banco.fdb banco.fbk;*
6 Caso obtenha erro, comece a ficar preocupado(rs..), tente:

*gbak -backup -v -ignore -garbage -limbo banco.fdb banco.fbk;*


7 Caso persista o erro, procure por empresas especializadas em reparar banco firebird, pois o
problema grave.
Caso voc tenha conseguido fazer o backup do banco, use o seguinte comando
para fazer o restore:
*gbak -create - v banco.fbk banco.fdb;*
Se ocorrer erro no restore tente com os parametros -inactive e -one_at_a_time
Melhor recomendao e se tenha o backup, existe diversos softwares, para
agendamento para automatizar o backup.
CMO TERMINAR TRANSACCIONES QUE SE QUEDARON COLGADAS?
Cuando se corta la conexin con el Servidor (quizs por un corte de la energa elctrica),
algunas transacciones pueden quedarse colgadas o sea tienen pendiente el COMMIT o el
ROLLBACK. Para terminarlas:
GFIX -user NombreUsuario -pass Contrasea -commit (o -rollback) all /
idTransaccin BaseDatos.FDB

RECOLECCIN DE BASURA
New records don't cause garbage collection. "Garbage collection" is the process of removing
record versions that are so old that no running transaction can reference them. A newly inserted
record has only one version (duh!) and doesn't invalidate any other version. Updates and deletes
create new versions. When the transaction that updated or deleted the record commits, it sets the
stage for garbage collection. When all concurrent transactions end, the older versions of the
record are no longer useful and become garbage. (We use graphic language at Firebird. The old
record versions neither smell nor attract flies and rodents.) Sooner or later, the old versions are
removed so the space they used can be reallocated.

There are three types of garbage collection: cooperative, thread-based, and mixed. Cooperative is
the only mode available in Classic or Super Classic. In cooperative garbage collection, when a
transaction reads a row, it checks for unneeded old versions and removes them immediately. In
thread-based garbage collection, when a transaction finds a row that has unneeded old versions,
it puts that row's record number on the queue for the garbage collection thread. Eventually the
garbage collection thread comes by and cleans up. In the mixed mode of garbage collection (80%
certainty), when a transaction reads a row with unneeded old versions, it cleans them
immediately if all the versions are on one page. If the back versions are on a different page, the

transaction puts the record number of the row on the garbage collect list and the garbage
collection thread cleans up.
The problem with cooperative garbage collection is that after a large update or delete operation,
some unfortunate transaction that's just trying to collect data for a report can get saddled with
lots of I/O removing garbage. The problem with thread-based garbage collection is that in a
heavily laden system, the garbage collector thread doesn't get enough cycles, and the information
density of the database goes down. The mixed mode has both problems. See also Postgres: online and off-line vacuuming.
Ann Harrison

ERROR AL MOSTRAR UNA CONSULTA


La consulta:

SELECT
*
FROM
MiTabla

funciona ok, sin embargo la consulta:


SELECT
*
FROM
MiTabla
ORDER BY
MiColumna

podra mostrar un mensaje de error por qu eso? Porque para ordenar la tabla segn
MiColumna el Firebird necesita escribir datos intermedios en una carpeta temporal. Si no tiene
acceso a la carpeta temporal o si hay muy poco espacio libre en el disco duro entonces no podr
escribir los datos intermedios que necesita.
La/s carpeta/s temporaria/s se especifican en el archivo FIREBIRD.CONF, por ejemplo
con:
TEMPDIRECTORIES=C:\TEMP; D:\TEMP

EXPORTANDO A UN ARCHIVO DE TEXTO


Bom dia/tarde/noite Frederico.
Primeiro, voc deve habilitar o acesso do Firebird arquivos externos s suas bases de dados.
Para isso, edite o arquivo "firebird.conf", e localize a varivel/parmetro "ExternalFileAccess".
Se houver um caracter "#" no incio da linha, remova-o, pois esse carcter comenta todo o
Restante da linha.
Esse parmetro "ExternalFileAccess" controla o acesso aos arquivos externos s suas bases de
dados. E pode ter 3 tipos de acesso. So eles:
1 - Sem acesso a qualquer arquivo externo.
Nessa situao, o Firebird no permitir o acesso a qualquer arquivo externo sua base de dados.
Exemplo: ExternalFileAccess=None
2 - Acesso restrito aos arquivos de determinadas pastas/diretrios.
Nessa situao, o Firebird s permitir o acesso a qualquer arquivo que esteja em alguma das
pastas/diretrios informadas (separe-as com ponto-e-vrgula).
Exemplo: ExternalFileAccess=C:\Meus Arquivos;D:\Sistemas\XYZ\Dados\Exportao
3 - Acesso completo a qualquer arquivo de qualquer pasta/diretrio.
Nessa situao, o Firebird no far qualquer restrio de acesso, sembrando que a restrio ser
efetuada apenas pelos direitos do usurio que o Firebird est utilizando para executar (system,
administrador, fulano, beltrano, etc...).
Exemplo: ExternalFileAccess=Full
Vamos supor que voc escolheu o acesso completo (Full). Agora vamos criar uma tabela de
exemplo, de onde vamos ler os registros e export-los diretamente para um arquivo texto.
*CREATE TABLE FUNCIONARIOS(
-- Chave primria.
CODIGO INTEGER NOT NULL,
-- Nome completo.
NOME VARCHAR(200) CHARACTER SET ISO8859_1 NOT NULL COLLATE PT_BR,
-- CPF sem mscara.
CPF VARCHAR(11) CHARACTER SET ISO8859_1 NOT NULL COLLATE PT_BR,
-- Regra da chave primria.
CONSTRAINT PK_FUNCIONARIOS PRIMARY KEY(CODIGO),

-- Regra de unicidade do CPF (permite homnimos, mas no funcionrios com


o mesmo CPF).
CONSTRAINT UK_FUNCIONARIOS_CPF UNIQUE(CPF));*

Vamos supor que voc j inseriu dados na tabela FUNCIONARIOS. Agora a misso exportar
esses dados para o arquivo texto: "C:\Temp\Funcionarios.txt".
Vamos criar uma tabela que residir no arquivo externo "C:\Temp\Funcionarios.txt", ou seja, essa
nova tabela ser o prprio arquivo texto a ser gerado. Como se trata de um arquivo texto,
utilizaremos apenas colunas/campos do tipo CHAR, pois os outros tipos resultaro em
dados binrios.
*CREATE TABLE EXPORTACAO EXTERNAL FILE 'C:\Temp\Funcionarios.txt' (
-- Nome completo do funcionrio.
NOME CHAR(200) CHARACTER SET ISO8859_1 NOT NULL COLLATE PT_BR,
-- CPF do funcionrio.
CPF VARCHAR(11) CHARACTER SET ISO8859_1 NOT NULL COLLATE PT_BR,
-- Quebra de linha de texto (caracteres CR + LF = CHR(13) + CHR(10) no
caso do MS Windows).
CRLF CHAR(2));*

Nesse momento, o arquivo "C:\Temp\Funcionarios.txt" ainda no ser criado, apenas quando


comearmos a inserir os registros/linhas nessa tabela externa que o arquivo ser criado.
Agora vamos exportar os dados, inclusive ordenando pelo nome dos funcionrios.
INSERT INTO EXPORTACAO
SELECT
NOME,
CPF
FROM
FUNCIONARIOS
ORDER BY
NOME
COMMIT;

O arquivo texto foi criado com sucesso, agora podemos excluir essa tabela externa, caso no
precisemos mais dela.
*DROP TABLE EXPORTACAO;*
Nota: Excluindo a tabela externa no exclui tambm o respectivo arquivo. Ento pode exclu-la
sem problema algum.
Esse apenas um pequeno exemplo. Espero que lhe sirva para suprir as suas necessidades.
Espero ter ajudado mais que atrapalhado. :D
Sandro Souza

UN SELECT QUE MUESTRA LAS CARACTERSTICAS DE LA TRANSACCIN


ACTUAL
SELECT
*
FROM
MON$TRANSACTIONS
WHERE
MON$TRANSACTION_ID = CURRENT_TRANSACTION
SIGNIFICADO DE LAS COLUMNAS DE LA TABLA MON$TRANSACTION
- MON$TRANSACTION_ID (transaction ID)
- MON$ATTACHMENT_ID (attachment ID)
- MON$STATE (transaction state)
0: idle (state after prepare, until execution begins)
1: active (state during execution and fetch. Idle state
returns after cursor is closed)
- MON$TIMESTAMP (transaction start date/time)
- MON$TOP_TRANSACTION (top transaction)
- MON$OLDEST_TRANSACTION (local OIT number)
- MON$OLDEST_ACTIVE (local OAT number)
- MON$ISOLATION_MODE (isolation mode)
0: consistency
1: concurrency
2: read committed record version
3: read committed no record version
- MON$LOCK_TIMEOUT (lock timeout)
-1: infinite wait
0: no wait
N: timeout N
- MON$READ_ONLY (read-only flag)
- MON$AUTO_COMMIT (auto-commit flag)
- MON$AUTO_UNDO (auto-undo flag)
- MON$STAT_ID (statistics ID)
MON$TOP_TRANSACTION is the upper limit used by the sweeper transaction
when advancing the
global OIT. All transactions above this threshold are considered active. It
is normally equivalent to the
MON$TRANSACTION_ID but COMMIT RETAINING or ROLLBACK RETAINING will
cause MON
$TOP_TRANSACTION to remain unchanged (stuck) when the transaction ID is
incremented.

Administrative Features
114
MON$AUTO_UNDO indicates the auto-undo status set for the transaction, i.e.,

whether a transactionlevel savepoint was created. The existence of the transaction-level


savepoint allows changes to be
undone if ROLLBACK is called and the transaction is then just committed. If
this savepoint does not
exist, or it does exist but the number of changes is very large, then an
actual ROLLBACK is executed
and the the transaction is marked in the TIP as dead.
Fonte : /firebird_2_1/doc/Firebird_v2.1.4.ReleaseNotes.pdf

INICIALIZANDO TODOS LOS GENERADORES


Este Stored Procedure inicializa cada generador con el ltimo nmero de ese generador
utilizado. Si por ejemplo el valor de un generador es 87 pero en la tabla el ltimo identificador es
45, lo inicializa a 45.
SET TERM ^ ;
CREATE OR ALTER PROCEDURE SP_UpdateSequences AS
DECLARE VARIABLE TableName VARCHAR(50);
DECLARE VARIABLE FieldName VARCHAR(50);
DECLARE VARIABLE SequenceName VARCHAR(50);
DECLARE VARIABLE MaxValue BIGINT;
DECLARE VARIABLE SQLCommand VARCHAR(200);
BEGIN
FOR
SELECT
TRIM(R.RDB$RELATION_NAME),
TRIM(F.RDB$FIELD_NAME),
TRIM(G.RDB$GENERATOR_NAME)
FROM RDB$RELATIONS AS R
JOIN RDB$RELATION_FIELDS AS F ON F.RDB$RELATION_NAME =
R.RDB$RELATION_NAME
JOIN RDB$GENERATORS AS G ON G.RDB$GENERATOR_NAME =
'SQ_' || TRIM(R.RDB$RELATION_NAME) || '_' || TRIM(F.RDB$FIELD_NAME)
INTO :TableName, :FieldName, :SequenceName
DO
BEGIN
SQLCommand = 'SELECT MAX(' || FieldName || ') FROM ' || TableName;
EXECUTE STATEMENT SQLCommand INTO MaxValue;
SQLCommand = 'ALTER SEQUENCE ' || SequenceName || ' RESTART WITH ' ||
COALESCE(MaxValue, 0);
EXECUTE STATEMENT SQLCommand;
END
END^

SET TERM ; ^
EXECUTE PROCEDURE SP_UpdateSequences;
--- Fim do SQL --Neste exemplo todos generatores (sequences) possui nomes neste formato:
SQ_NomeDaTabela_NomeDoCampo
Atenciosamente.
Daniel P. Guimares
Tecnobyte Informtica
www.tecnobyte.com.br

Potrebbero piacerti anche