Funcionalitats de Firebird

Funcionalitats en detall

Per començar, és important respondre les
clàssiques preguntes que s'han fet sempre a les base de dades
open-source, especialment MySQL. Sota aquestes linees les trobareu
respostes.



Soporta Transacions?



Si. Una transacció pot ser commitejada o desfeta. De fet,
Firebird inclús soporta els conceptes de savepoints i roolback
to savepoints, semblant al que trobem en Oracle. La funcionalitat
és útil sobretot quan en un procediment emmagatzemat o
trigger, volem desfer per exemple una transacció fins a un punt
lògic.  En Firebird, podem crear un savepoint i
després fer un rollback fins al savepoint especific. Si estem
executant un script SQL, podem anar posant savepoints pero poder fer
rollbacks apropiadament.



Té Soport per a claus forànees?



Si. Firebird utlitza la sintaxi estandard de SQL per proporcionar
soport per claus forànees, Per exemple, el següent codi SQL
activa el suport de clau foranea a la taula filla "child":


SQL> create table parent (parent_id int not null primary key,
CON> parent_val varchar(10));

SQL> create table child (child_id int not null, parent_id
CON> int not null, child_val varchar(10),
CON> primary key (child_id),
CON> foreign key (parent_id) references parent(parent_id));

Soporta bloquejos a nivell de registre?

Si. Per defecte, Firebird utilitza un sistema concurrent
multiversió de registres. Això significa que totes les
sessions veuen les dades antigues fins que la nova no està
commitejada. Una alternativa a la tècnica automàtica de
bloquejos, per forçar nosaltres un bloqueig, es podria fer
utlitzant la clausula with lock en
una select .... for update. En els 2 casos el bloqueig es produeix a
nivell de registre. Aquí teniu un exemple : Assumeix que 2
sessions estan accedint a la taula definida anterioment:


Session # 1:
SQL> select * from parent;

PARENT_ID PARENT_VAL
============ ==========

1 Preimage

SQL> update parent set parent_val = 'Postimage' where parent_id = 1;
SQL> select * from parent;

PARENT_ID PARENT_VAL
============ ==========

1 Postimage

Session #2:
SQL> select * from parent;

PARENT_ID PARENT_VAL
============ ==========

1 Preimage

Session #1:
SQL> commit;

Session #2:
SQL> commit;
SQL> select * from parent;

PARENT_ID PARENT_VAL
============ ==========

1 Postimage

Com es pot veure, les transaccions no commitejades en la session #1
no bloquegen la segona sessió d'accedir a les dades.De totes
maneres la sessió #2 podrà accedir al valor antic de les
dades i no al nou.

L'altre sistema important de bloquejos és el bloqueig
amb  "select for update" . Aquest sistema és convenient ja
que et permet tenir bloquejos exclusius sobre un registre; garanteix
que cap altre sessió pugui canviar les dades fins que la
sessió anterior acabi. D'aquest manera la sessió
s'assegura que la informació no ha canviat desde el moment en
que es fa una select fins al moment que es fa l'update.

Session #1:

SQL> select * from parent where parent_id = 1 for update with lock;

PARENT_ID PARENT_VAL
============ ==========

1 Postimage

Session #2:
SQL> update parent set parent_val = 'Postimage2' where parent_id = 1;
(Hangs)

Com podeu veure, la sessió #2 el valor de parent_val fins que
la sessió #1 aplica un commit o un rollback. Aquest sofisticat
sistema de bloquejos no el té per exemple MySQL, inclus amb les
innoDB tables.

Soporta procediments emmagatzemats i triggers?

Si. En aquesta area Firebird realment brilla. L'aventatge de tenir
un llenguatge standaritzat per procediments emmagatzemats és que
el desenvolupadors que venen de una altre llenguatge poden estar
treballant en un espai de temps molt breu. De fet, vaig trigar uns 10
minuts en apendre a escriure procediments en Firebird. Encara que
PostgreSQL ofereixi suport per a procediments emmagatzemats, aquests es
poden realitzar amb diferents llenguatges (Perl, Tcl, Python) , ens
podem trobar en problemes a la hora d'afegir programadors a un projecte
ja que a priori hauran de dominar tots aquests llenguatges. Utilitzant
un llenguatge estandaritzat es soluciona aquest problema. Els triggers
en Firebird són semblants als de Informix/Oracle, amb la
opció de les clausules before  i after
insert/update/delete, millors que els tipus de taules virtuals
INSERTED/UPDATED/DELETED de Sybase.

Anem a crear un procediment simple que ens mostri la potencia del
llenguatge. El següent exemple afegeix un registre a la taula
filla per a parent amb valor os. Si el valor de os Linux afegeix una
altra linea en la taula child i també afegeix la entrada
LinuxRocks.


SET TERM !! ;
CREATE PROCEDURE insert_into_child (os_type varchar(10))
AS
BEGIN
insert into child (child_id, parent_id, child_val)
values (gen_id(gen_child_id, 1),
(select parent_id from parent where parent_val='os'),
:os_type);

if (:os_type = 'linux') then
begin
insert into child (child_id, parent_id, child_val)
values (gen_id(gen_child_id, 1),
(select parent_id from parent where parent_val='os'),
'LinuxRocks');
end
else
begin
insert into child (child_id, parent_id, child_val)
values (gen_id(gen_child_id, 1),
(select parent_id from parent where parent_val='os'),
'Boo!');
end
EXIT;
END !!
SET TERM ; !!

Aquest és un exemple de un trigger que comprova els insterts
i upddates en la taula child per mirar si la entrada és
LinuxRocks; Si és així afegeix una altra entrada a la
taula dient YouSaidIt!

SET TERM !! ;
CREATE trigger you_said_it for child
after insert or update
AS
BEGIN
if (new.child_val = 'LinuxRocks') then
insert into child (child_id, parent_id, child_val)
values (gen_id(gen_child_id, 1),
(select parent_id from parent where parent_val='os'),
'YouSaidIt!');
EXIT;
END !!
SET TERM ; !!

Ara que hem vist les preguntes més freqüents a les bases
de dades open-source, mirarem les atres funcionalitats que ens pot
oferir Firebird.


pàgina generada en: 0.548 segons.