quinta-feira, 1 de abril de 2010

Banco de Dados - Firebird

Olá pessoal,
por mais que pareça fora do escopo ao que o blog se propõe a abordar (que é programação), vamos tratar nest post sobre Banco de Dados, mais especificamente o Sistema Gerenciador de Banco de Dados Relacional (SGBDR) Firebird.

Este banco de dados open-source é descendente do Interbase 6 - devido a Borland abrir o código fonte do mesmo e em versões posteriores voltar a distribuí-lo sob licença comercial, instigando à comunidade a desenvolver, a partir dos fontes do Interbase, uma nova versão aberta à comunidade.

Aprofunde seus conhecimentos visitando o site oficial ou o portal Firebase onde você poderá acessar vários artigos e dicas interessantes.

Se você não foi convencido a clicar nos links acima, acredito que após visualizar esta apresentação irá se convencer!

A versão 2.5 do Firebird, está no segundo Release Candidate, confira!

Download Firebird 2.5

Tenho orgulho de dizer que comecei a programar na PL/SQL do Firebird (lembro-me como se fosse hoje), foi um trigger... meu primeiro contato com programação!!

Dá para fazer muitas coisas legais no banco de dados, ainda mais nas versões superiores à 2.0.

Segue alguns exemplos:
/**
* A procedure abaixo foi utilizada para gerar uma chave
* de uma informação passada como parâmetro de entrada.
* As funções embutidas (SDF) ASCII_CHAR, ASCII_VAL,
* BIN_XOR foram implementadas na versão 2.1, o
* CHAR_LENGHT já existia na versão 2.0.
*/

CREATE OR ALTER PROCEDURE SP$GERAR_HASH_CHAVE (
INPUT_HASH VARCHAR(255))
RETURNS (
OUTPUT_HASH CHAR(1))
AS
DECLARE VARIABLE POS_CHAVE SMALLINT = 3;
DECLARE VARIABLE TAMANHO_CHAVE SMALLINT;
BEGIN
TAMANHO_CHAVE = CHAR_LENGTH(INPUT_HASH);
IF (TAMANHO_CHAVE > 1) THEN
BEGIN
OUTPUT_HASH =
ASCII_CHAR(BIN_XOR(ASCII_VAL(SUBSTRING(INPUT_HASH FROM 1 FOR 1)),
ASCII_VAL(SUBSTRING(INPUT_HASH FROM 2 FOR 1))));
WHILE (POS_CHAVE <= TAMANHO_CHAVE) DO
BEGIN
OUTPUT_HASH = ASCII_CHAR(BIN_XOR(ASCII_VAL(OUTPUT_HASH),
ASCII_VAL(SUBSTRING(INPUT_HASH
FROM POS_CHAVE FOR 1))));
POS_CHAVE = POS_CHAVE + 1;
END
END
ELSE
BEGIN
OUTPUT_HASH = SUBSTRING(INPUT_HASH FROM 1 FOR 1);
END
SUSPEND;
END

Exemplo de uso/chamada da procedure acima:
/**
* Faço uma instrução select, informando o parâmetro
* de retorno e o nome da procedure na cláusula from,
* seguida do parâmetro de entrada.
*/
SELECT OUTPUT_HASH FROM SP$GERAR_HASH_CHAVE('Firebird')

Retorna: "%"

O trigger abaixo pode ser criado na versão 2.5, quando foi implementado database trigger no Firebird, consulte o Release Notes para ficar por dentro de todas as novidades (e saber como implementá-las!).

/**
* Trigger utilizada para validar a conexão de um
* usuário ao banco de dados, sendo disparada ao
* conectar (active on connect) assegurando
* que aquele usuário da conexão está cadastrado na
* tabela de usuário daquele banco de dados e não é
* o SYSDBA, caso onde o usuário da aplicação que
* utiliza o banco de dados é o mesmo do Security2.fdb
* - banco de dados que armazena os usuário do
* servidor Firebird.
*/
CREATE OR ALTER TRIGGER TRI$VALIDA_CONEXAO
ACTIVE ON CONNECT POSITION 0
AS
BEGIN
IF (NOT EXISTS(SELECT
1
FROM TB$USUARIO
WHERE TB$USUARIO.NOME = CURRENT_USER)
OR (CURRENT_USER = 'SYSDBA')) THEN
BEGIN
EXCEPTION E$LOGIN_INVALIDO;
END
END

É isso pessoal, como última dica fica a indicação do IBExpert para gerenciamento/manutenção do banco de dados Firebird - é excelente!