principais recursos do firebird 2

15
Principais recursos do Firebird 2.1 Para a alegria de muitos desenvolvedores e usuários, em Abril/2008 foi lançada a versão final do Firebird 2.1! Apesar do incremento de apenas 0.1 no número da versão (de 2.0 para 2.1), a quantidade de novos recursos e melhorias inseridas neste release do SGBD é expressiva, e facilmente justificaria ganhar um incremento maior, no mínimo, para 2.5 ;-) Migrando para o FB 2.1 Migrar de uma versão para outra do Firebird nunca foi uma tarefa complicada. Este release mantém a mesma facilidade de sempre, geralmente bastando um backup/restore para atualizar a ODS (On Disk Structure) do arquivo. No entanto, nesta versão, alguns detalhes devem ser observados, especialmente para quem tem o hábito de usar caracteres fora da tabela ASCII (ex: acentuados) na metadata dos seus BDs. Até a versão 2.0, durante a criação ou alteração dos objetos do banco de dados (tabelas, procedures, etc.), o Firebird não fazia a “tradução” do charset do código fonte da metadata entre a aplicação cliente e a codificação padrão, usada internamente no BD (UNICODE_FSS). Além disso, durante a leitura de blobs textuais, o FB não estava convertendo a informação armazenada para o charset utilizado no cliente. Esses problemas foram resolvidos nesta versão. Isso só não é verdade se você criar ou alterar objetos no banco de dados, onde a metadata contenha caracteres fora do padrão UNICODE_FSS, utilizando uma conexão com charset NONE ou UNICODE_FSS. Caso seu banco de dados tenha objetos definidos com caracteres fora do padrão ASCII, você deve repará-lo para que possa ser lido após a migração para o Firebird 2.1. O artigo "Migrando um BD para o FB 2.1 " descreve dois métodos para corrigir o problema. Escolha o que julgar mais adequado para o seu caso. PRINCIPAIS NOVIDADES Monitoramento de banco de dados Talvez este seja o recurso mais aguardado para esta versão do Firebird. Aqueles que sempre quiseram saber o que se passava dentro de um banco de dados em um determinado momento, agora poderão extrair essa informação através das tabelas virtuais de monitoramento! Note

Upload: itamar-apucarana

Post on 22-Nov-2015

56 views

Category:

Documents


0 download

TRANSCRIPT

Principais recursos do Firebird 2.1Para a alegria de muitos desenvolvedores e usurios, em Abril/2008 foi lanada a verso final do Firebird 2.1! Apesar do incremento de apenas 0.1 no nmero da verso (de 2.0 para 2.1), a quantidade de novos recursos e melhorias inseridas neste release do SGBD expressiva, e facilmente justificaria ganhar um incremento maior, no mnimo, para 2.5 ;-)Migrando para o FB 2.1Migrar de uma verso para outra do Firebird nunca foi uma tarefa complicada. Este release mantm a mesma facilidade de sempre, geralmente bastando um backup/restore para atualizar a ODS (On Disk Structure) do arquivo. No entanto, nesta verso, alguns detalhes devem ser observados, especialmente para quem tem o hbito de usar caracteres fora da tabela ASCII (ex: acentuados) na metadata dos seus BDs.At a verso 2.0, durante a criao ou alterao dos objetos do banco de dados (tabelas, procedures, etc.), o Firebird no fazia a traduo do charset do cdigo fonte da metadata entre a aplicao cliente e a codificao padro, usada internamente no BD (UNICODE_FSS). Alm disso, durante a leitura de blobs textuais, o FB no estava convertendo a informao armazenada para o charset utilizado no cliente.Esses problemas foram resolvidos nesta verso. Isso s no verdade se voc criar ou alterar objetos no banco de dados, onde a metadata contenha caracteres fora do padro UNICODE_FSS, utilizando uma conexo com charset NONE ou UNICODE_FSS.Caso seu banco de dados tenha objetos definidos com caracteres fora do padro ASCII, voc deve repar-lo para que possa ser lido aps a migrao para o Firebird 2.1.O artigo "Migrando um BD para o FB 2.1" descreve dois mtodos para corrigir o problema. Escolha o que julgar mais adequado para o seu caso.PRINCIPAIS NOVIDADESMonitoramento de banco de dadosTalvez este seja o recurso mais aguardado para esta verso do Firebird. Aqueles que sempre quiseram saber o que se passava dentro de um banco de dados em um determinado momento, agora podero extrair essa informao atravs das tabelas virtuais de monitoramento! Note que, para ter acesso a esse recurso, sua base de dados deve estar com a ODS na verso 11.1.A recuperao das informaes de monitoramento feita atravs de selects normais, executados nas tabelas de monitoramento. importante saber que o acesso informao feito com a transao associada ao select de monitoramento no isolamento Consistency. Com isso, para atualizar as informaes recuperadas (refresh), necessrio fechar a transao atual e executar o select novamente, abrindo uma nova transao. Isso garante que as informaes de tabelas de monitoramento inter-relacionadas (mestre-detalhe) estaro sempre consistentes.A consulta completa das informaes de monitoramento s pode ser realizada pelo owner do banco de dados, ou pelo SYSDBA. Usurios normais s tm acesso s informaes relacionadas sua prpria conexo com o banco.As tabelas de monitoramento so: MON$DATABASE, MON$ATTACHMENTS, MON$TRANSACTIONS, MON$TRANSACTIONS, MON$STATEMENTS, MON$CALL_STACK, MON$IO_STATS, MON$RECORD_STATS. A tabela abaixo contm a estrutura das tabelas e uma breve descrio dos campos. Para informaes mais detalhadas, leia o release notes que acompanha a instalao do produto.MON$DATABASE (connected database)- MON$DATABASE_NAME (database pathname or alias)- MON$PAGE_SIZE (page size)- MON$ODS_MAJOR (major ODS version)- MON$ODS_MINOR (minor ODS version)- MON$OLDEST_TRANSACTION (OIT number)- MON$OLDEST_ACTIVE (OAT number)- MON$OLDEST_SNAPSHOT (OST number)- MON$NEXT_TRANSACTION (next transaction number)- MON$PAGE_BUFFERS (number of pages allocated in the cache)- MON$SQL_DIALECT (SQL dialect of the database)- MON$SHUTDOWN_MODE (current shutdown mode) 0: online, 1: multi-user shutdown, 2: single-user shutdown, 3: full shutdown- MON$SWEEP_INTERVAL (sweep interval)- MON$READ_ONLY (read-only flag)- MON$FORCED_WRITES (sync writes flag)- MON$RESERVE_SPACE (reserve space flag)- MON$CREATION_DATE (creation date/time)- MON$PAGES (number of pages allocated on disk)- MON$BACKUP_STATE (current physical backup state) 0: normal, 1: stalled, 2: merge- MON$STAT_ID (statistics ID)

MON$ATTACHMENTS (connected attachments)- MON$ATTACHMENT_ID (attachment ID)- MON$SERVER_PID (server process ID)- MON$STATE (attachment state) 0: idle, 1: active- MON$ATTACHMENT_NAME (connection string)- MON$USER (user name)- MON$ROLE (role name)- MON$REMOTE_PROTOCOL (remote protocol name)- MON$REMOTE_ADDRESS (remote address)- MON$REMOTE_PID (remote client process ID)- MON$REMOTE_PROCESS (remote client process pathname)- MON$CHARACTER_SET_ID (attachment character set)- MON$TIMESTAMP (connection date/time)- MON$GARBAGE_COLLECTION (garbage collection flag)- MON$STAT_ID (statistics ID)

MON$TRANSACTIONS (started transactions)- 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 statereturns 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

MON$STATEMENTS (prepared statements)- MON$STATEMENT_ID (statement ID)- MON$ATTACHMENT_ID (attachment ID)- MON$TRANSACTION_ID (transaction ID)- MON$STATE (statement state) 0: idle, 1: active- MON$TIMESTAMP (statement start date/time)- MON$SQL_TEXT (statement text, if appropriate)- MON$STAT_ID (statistics ID)

MON$CALL_STACK (call stack of active PSQL requests)- MON$CALL_ID (call ID)- MON$STATEMENT_ID (top-level DSQL statement ID)- MON$CALLER_ID (caller request ID)- MON$OBJECT_NAME (PSQL object name)- MON$OBJECT_TYPE (PSQL object type)- MON$TIMESTAMP (request start date/time)- MON$SOURCE_LINE (SQL source line number)- MON$SOURCE_COLUMN (SQL source column number)- MON$STAT_ID (statistics ID)

MON$IO_STATS (I/O statistics)- MON$STAT_ID (statistics ID)- MON$STAT_GROUP (statistics group) 0: database, 1: attachment, 2: transaction, 3: statement, 4: call- MON$PAGE_READS (number of page reads)- MON$PAGE_WRITES (number of page writes)- MON$PAGE_FETCHES (number of page fetches)- MON$PAGE_MARKS (number of pages with changes pending)

MON$RECORD_STATS (record-level statistics)- MON$STAT_ID (statistics ID)- MON$STAT_GROUP (statistics group) 0: database, 1: attachment, 2: transaction, 3: statement, 4: call- MON$RECORD_SEQ_READS (number of records read sequentially)- MON$RECORD_IDX_READS (number of records read via an index)- MON$RECORD_INSERTS (number of inserted records)- MON$RECORD_UPDATES (number of updated records)- MON$RECORD_DELETES (number of deleted records)- MON$RECORD_BACKOUTS (number of records where a new primary record version or a change to an existing primary recordversion is backed out due to rollback or savepoint undo)- MON$RECORD_PURGES (number of records where record version chain is being purged of versions no longer needed by OATor younger transactions)- MON$RECORD_EXPUNGES (number of records where record version chain is being deleted due to deletions by transactionsolder than OAT)

No exemplo abaixo, o select retorna as informaes sobre as transaes ativas no banco de dados, que no esto associadas com a conexo que est rodando o select de monitoramento (veja a clusula where).select mon$transaction_id, mon$attachment_id, mon$state, mon$timestamp, mon$top_transaction, mon$oldest_transaction, mon$oldest_active, mon$isolation_mode, mon$lock_timeout, mon$read_only, mon$auto_commit, mon$auto_undo, mon$stat_id, case mon$isolation_mode when 0 then 'Consistency' when 1 then 'Concurrency' when 2 then 'Read Committed Record Version' when 3 then 'Read Committed' else 'Unknown' end as Desc_Isolation, case MON$LOCK_TIMEOUT when -1 then 'Infinite Wait' when 0 then 'No wait' else 'Timeout ' || cast(MON$LOCK_TIMEOUT as varchar (20)) end as Desc_TimeOutfrom mon$transactionswhere (mon$attachment_id current_connection)order by 1Cancelando comandosAtravs das tabelas de monitoramento, possvel cancelar queries ou comandos que esto sendo executados. Para isso, basta abrir uma conexo com o banco de dados e dar um delete na tabela mon$statements, apagando o registro que representa o comando que voc quer cancelar. O comando abaixo cancela todos os comandos que esto sendo executados no banco de dados, e que no estejam associados conexo do SYSDBA (que est executando o cancelamento):delete from mon$statementswhere mon$attachment_id current_connection;Tabelas Globais Temporrias (GTT = Global Temporary Table)O recurso de tabelas temporrias foi implementado inicialmente no Fyracle (verso do Firebird que simula um SGBD Oracle) e agora foi integrado ao Firebird. As metadatas das tabelas temporrias ficam armazenadas no BD, e por isso so compartilhadas entre todas as conexes. Os dados contidos nestas tabelas so temporrios, e visveis apenas para a conexo que os originou. Atravs de isolamento transacional, podemos isolar os dados no nvel de transao, dentro de uma mesma conexo. possvel definir tabelas temporrias de forma que os dados existam apenas durante a durao da conexo que os originou, ou ento sejam apagados automaticamente quando a transao que os originou for encerrada. A especificao da durao dos dados feita durante a criao da tabela temporria. Caso seja especificada a clusula ON COMMIT PRESERVE ROWS, os dados existiro durante a durao da conexo. Caso seja especificado ON COMMIT DELETE ROWS, eles sero apagados to logo a transao seja encerrada. A sintaxe resumida para criao de tabelas temporrias segue o padro de um create table comum, diferenciado apenas pelas clusulas apropriadas:CREATE GLOBAL TEMPORARY TABLE...[ON COMMIT ROWS]Praticamente todos os recursos disponveis para uma tabela normal (ex: triggers, ndices, integridade referencial) esto disponveis para as tabelas temporrias, salvo as seguintes excees: No possvel criar referncias entre tabelas permanentes e temporrias. Uma tabela criada com a opo PRESERVE ROWS no pode referenciar outra tabela criada com a opo DELETE ROWS. Uma constraint definida para um domnio no pode fazer referncia a uma GTT.Nota: Os dados armazenados em tabelas temporrias ficam salvos em arquivos temporrios, fora do arquivo do banco de dados.Otimizao do protocolo de comunicaoO Firebird, quando utilizado no modelo duas camadas (cliente servidor) em redes de baixa velocidade (ex: Internet), se mostra bastante lento. O culpado, neste caso, o protocolo de comunicao responsvel pela conversa entre a aplicao cliente e o servidor Firebird, que no foi originalmente escrito para ser usado em redes com banda limitada. A soluo definitiva para este problema vir em alguma verso futura do Firebird, com a criao de um novo protocolo de comunicao. No entanto, isso quebrar a compatibilidade de comunicao com servidores antigos.No Firebird 2.1, algumas rotinas do atual protocolo de comunicao foram otimizadas, de forma a gerar menos conversa entre o cliente e o servidor, sem perder a compatibilidade com as verses anteriores do Firebird. Em alguns casos, um ganho de performance de cerca de 40% pde ser observado nas conexes via internet. Para ter total proveito das otimizaes realizadas, necessrio que a conexo esteja usando o fbclient.dll da verso 2.1, e que o servidor tambm seja 2.1 (ou superior).Nota: Drivers que acessam diretamente o servidor, sem passar pela fbclient.dll (ex: JayBird e .NET Provider) devero ter seus cdigos atualizados para que tirem proveito das otimizaes.Database TriggersEste um recurso criado pelo Adriano Fernandes, nico brasileiro atualmente a fazer parte da equipe de desenvolvimento do FB. Estes triggers especiais so disparados quando uma conexo ou transao iniciada/encerrada. A sintaxe de criao pode ser vista abaixo: ::={CREATE | RECREATE | CREATE OR ALTER}TRIGGER [ACTIVE | INACTIVE]ON [POSITION ]ASBEGIN...END ::=CONNECT | DISCONNECT | TRANSACTION START | TRANSACTION COMMIT | TRANSACTION ROLLBACKA seqncia de operaes realizadas durante uma conexo com o banco : A conexo com o banco estabelecida. A transao iniciada. Os triggers do tipo CONNECT so executados; excees que no forem tratadas faro um rollback da transao, encerraro a conexo e retornaro para o cliente. A transao commitadaDurante a desconexo: Uma transao iniciada Triggers so disparados. As excees que no forem tratadas ocasionaro um rollback da transao e encerraro a conexo, no sendo retornadas ao cliente. A transao commitada A conexo encerrada.Abertura de uma transao: Os triggers so disparados; excees no tratadas so enviadas para o cliente e a transao desfeita (rollback).Commit de uma transao: Os triggers so disparados; excees no tratadas faro com que as instrues executadas pelos triggers de transao sejam desconsideradas. O commit abortado e a exceo retornada para o cliente, para que ele d um rollback na transao toda, ou corrija o problema e tente um commit novamente.Nota: Para casos onde o commit em duas fases esteja sendo usado, o trigger ser executado no prepare e no no commit.RollBack de uma transao: Os triggers so disparados durante o rollback da transao. As alteraes feitas so descartadas junto com a transao. As excees so desconsideradas. Notas para os triggers de banco de dados: Os triggers no podem ter seus tipos alterados. A permisso de criar, alterar, recriar ou apagar os triggers limitada ao owner do banco ou ao SYSDBA.Nota: Parmetros de linha de comando foram criados para os utilitrios gbak, nbackup e isql, para que eles no disparem os database triggers. Bancos de dados em parties RAWEstamos acostumados a criar os bancos de dados em parties gerenciadas por um sistema de arquivos (ex: fat32, ntfs, ext3, etc). O Firebird permite criar os bancos de dados em parties RAW, ou seja, que no so gerenciadas por sistemas de arquivos. Isso pode aumentar consideravelmente a performance em bancos de dados configurados com forced writes on e que crescem rapidamente.Este recurso visa basicamente o Linux, visto que neste sistema operacional relativamente fcil trabalhar com parties no formatadas (diferente do que acontece no Windows).Forced Writes no Linux agora realmente funcionaSe voc costumava a ativar o recurso de forced writes nos bancos de dados armazenados no Linux, saiba que este recurso nunca funcionou! Recentemente, o problema foi descoberto e resolvido. Nota: O problema afetava somente a verso Linux do Firebird.Quando forced writes est ligado (on), os dados gravados no BD no permanecem no cache de disco, sendo gravados imediatamente, diminuindo muito a chance de ocorrer uma corrupo no banco de dados devido a fatores externos.Pr-alocao de espao no discoSabemos que o arquivo de um banco de dados Firebird cresce de acordo com a necessidade. O Firebird 2.1 introduz a possibilidade de pr-alocar espao, diminuindo a fragmentao do arquivo, o que causa um impacto positivo na performance de leitura do disco. No momento, este recurso est disponvel apenas para a verso Windows.O novo parmetro DatabaseGrowthIncrement pode ser configurado no firebird.conf, e determina o limite mximo (em bytes) que poder ser pr-alocado na requisio de alocao de espao para o banco de dados. O padro 128MB. Configurar esse parmetro com o valor zero desativa o recurso de pr-alocao.Nota: Em situaes muito especficas, havia a possibilidade de corrupo de um BD, caso a partio onde ele estivesse armazenado ficasse cheia. Para solucionar este problema, o Firebird 2.1, no momento de alocao de espao, faz com que as pginas criadas sejam imediatamente gravadas no disco. Isso significa que o Firebird est realizando uma operao de escrita adicional em relao ao modelo anterior, o que, em algumas situaes, pode afetar negativamente a performance.Common Table Expressions (CTE)O conceito de uma CTE pode ser difcil de explicar, e consequentemente, de entender. Abaixo temos a sintaxe completa do comando:select : select_expr for_update_clause lock_clauseselect_expr : with_clause select_expr_body order_clause rows_clause | select_expr_body order_clause rows_clausewith_clause : WITH RECURSIVE with_list | WITH with_listwith_list : with_item | with_item ',' with_listwith_item : symbol_table_alias_name derived_column_list AS '(' select_expr ')'select_expr_body : query_term | select_expr_body UNION distinct_noise query_term | select_expr_body UNION ALL query_termPara facilitar, vamos direto para a prtica, usando os exemplos que acompanham o release notes. O banco de dados utilizado o j conhecido Employee.fdb (cuja estrutura pode ser vista na figura 1).

Figura 1. Estrutura do Employee.fdbImagine que queremos saber o oramento (budget) por departamento, para os anos de 1993,94,95 e 96.Utilizando o recurso das CTEs, o comando seria:WITHDEPT_YEAR_BUDGET AS ( SELECT FISCAL_YEAR, DEPT_NO, SUM(PROJECTED_BUDGET) AS BUDGET FROM PROJ_DEPT_BUDGET GROUP BY FISCAL_YEAR, DEPT_NO)SELECT D.DEPT_NO, D.DEPARTMENT,B_1993.BUDGET AS B_1993, B_1994.BUDGET AS B_1994,B_1995.BUDGET AS B_1995, B_1996.BUDGET AS B_1996FROM DEPARTMENT DLEFT JOIN DEPT_YEAR_BUDGET B_1993ON D.DEPT_NO = B_1993.DEPT_NO AND B_1993.FISCAL_YEAR = 1993LEFT JOIN DEPT_YEAR_BUDGET B_1994ON D.DEPT_NO = B_1994.DEPT_NO AND B_1994.FISCAL_YEAR = 1994LEFT JOIN DEPT_YEAR_BUDGET B_1995ON D.DEPT_NO = B_1995.DEPT_NO AND B_1995.FISCAL_YEAR = 1995LEFT JOIN DEPT_YEAR_BUDGET B_1996ON D.DEPT_NO = B_1996.DEPT_NO AND B_1996.FISCAL_YEAR = 1996WHERE EXISTS ( SELECT * FROM PROJ_DEPT_BUDGET B WHERE D.DEPT_NO = B.DEPT_NO)No caso, a expresso definida pela clusula WITH executada para registro em cada JOIN do select principal. Internamente, o Firebird utiliza tabelas derivadas para executar o comando. Para cada chamada DEPT_YEAR_BUDGET, o Firebird passa os valores do nmero do departamento e do ano fiscal como parmetros, agilizando a execuo.O resultado do comando acima pode ser visto na figura 2.

Figura 2. Resultado da execuo da CTEAs CTEs tambm podem ser recursivas (definida atravs da clusula RECURSIVE), ou seja, chamam a si mesmas. O limite de recursividade de 1.024 interaes. Veja, no exemplo abaixo, que DEPT_TREE chama a si mesma, a fim de montar uma rvore de departamentos. O resultado da execuo do comando est na figura 3.WITH RECURSIVE DEPT_YEAR_BUDGET AS (SELECT FISCAL_YEAR, DEPT_NO, SUM(PROJECTED_BUDGET) AS BUDGET FROM PROJ_DEPT_BUDGET GROUP BY FISCAL_YEAR, DEPT_NO ),DEPT_TREE AS (SELECT DEPT_NO, HEAD_DEPT, DEPARTMENT, CAST('' AS VARCHAR(255)) AS INDENT FROM DEPARTMENT WHERE HEAD_DEPT IS NULL UNION ALL SELECT D.DEPT_NO, D.HEAD_DEPT, D.DEPARTMENT, H.INDENT || ' ' FROM DEPARTMENT D JOIN DEPT_TREE H ON D.HEAD_DEPT = H.DEPT_NO )SELECT D.DEPT_NO, D.INDENT || D.DEPARTMENT AS DEPARTMENT, B_1993.BUDGET AS B_1993, B_1994.BUDGET AS B_1994, B_1995.BUDGET AS B_1995, B_1996.BUDGET AS B_1996FROM DEPT_TREE DLEFT JOIN DEPT_YEAR_BUDGET B_1993ON D.DEPT_NO = B_1993.DEPT_NO AND B_1993.FISCAL_YEAR = 1993LEFT JOIN DEPT_YEAR_BUDGET B_1994ON D.DEPT_NO = B_1994.DEPT_NO AND B_1994.FISCAL_YEAR = 1994LEFT JOIN DEPT_YEAR_BUDGET B_1995ON D.DEPT_NO = B_1995.DEPT_NO AND B_1995.FISCAL_YEAR = 1995LEFT JOIN DEPT_YEAR_BUDGET B_1996ON D.DEPT_NO = B_1996.DEPT_NO AND B_1996.FISCAL_YEAR = 1996

Figura 3. Resultado da CTE recursiva.Nota: Consulte o release notes para saber as limitaes e todos os detalhes das CTEs.LISTCria uma string contendo uma lista de valores, usando o separador especificado. Por exemplo:select list(distinct state_province, ',')from customerResultado: CA, HI, MA, ONNo exemplo acima, a clusula distinct impede que valores repetidos apaream no resultado.INSERT sem valoresAgora possvel rodar um INSERT sem especificar os valores que sero inseridos. Para tanto, necessrio que triggers before insert atribuam os valores nos campos definidos como not null, ou ento que esses campos tenham valores default declarados na definio do prprio campo (ou domnio). A sintaxe :INSERT INTO DEFAULT VALUES [RETURNING ]RETURNINGA clusula RETURNING permite que um insert, update ou delete retorne valores de quaisquer campos da tabela manipulada. Isso pode ajudar bastante quando o valor de uma chave primria est sendo definido por um generator chamado em um trigger before insert,e desejamos saber qual o valor atribudo para a chave primria logo aps a execuo do insert. Por exemplo:insert into customer (customer)values ('Carlos')returning cust_no;Resultado: CUST_NO = 1019No exemplo acima, um novo registro foi inserido na tabela CUSTOMER, onde foi especificado apenas o nome do novo cliente (Carlos). A chave primria (cust_no) teve seu valor (1.019) atribudo em um trigger before insert, e foi retornado pelo insert. Vejamos abaixo, com seria o uso de returning em uma operao de remoo de registro, onde desejamos saber o nome do cliente apagado.delete from customerwhere cust_no = 1019returning customer;Resultado: CarlosNota: No possvel usar returning quando o comando associado retorna mltiplas linhas, como por exemplo, se o delete do exemplo anterior apagasse mais de um registro.UPDATE OR INSERTO comando UPDATE OR INSERT permite que uma nica instruo atualize os dados de um registro j existente ou, caso ele no exista, crie o novo registro na tabela. A sintaxe do comando pode ser vista abaixo:UPDATE OR INSERT INTO [()]VALUES ()[MATCHING ][RETURNING [INTO ]]A clausula MATCHING permite definir as colunas que sero pesquisadas para saber se o registro j exite na tabela em questo. Quando omitida, a comparao ser feita pela chave primria (neste caso, obrigatria). Vejamos alguns exemplos:UPDATE OR INSERT INTO CUSTOMER (CUST_NO,CUSTOMER)VALUES (2000,'JOHN');O comando acima inseriu um novo cliente na tabela customer, chamado JOHN, e com a chave primria definida como 2.000. UPDATE OR INSERT INTO CUSTOMER (CUST_NO,CUSTOMER)VALUES (2000,'MIKE');O comando acima, ao invs de inserir um novo registro com o nome MIKE, atualizou o registro j existente (localizado pela chave primria igual a 2.000), trocando o nome de JOHN para MIKE.Novas funes internasMuitos usurios reclamavam que o Firebird possua poucas funes internas. Obviamente, o problema pode ser contornado facilmente atravs do uso de UDFs. No entanto, a verso 2.1 traz inmeras novas funes, dispensando completamente, em muitos casos, o uso de UDFs. A listagem completa de todas as funes adicionadas, bem como a descrio do funcionamento de cada uma, pode ser obtida no Apndice A do release notes, e inclui: ABS, ACOS, ASCII_CHAR, ASCII_VAL, ASIN, ATAN, ATAN2, BIN_AND, BIN_OR, BIN_SHL, BIN_SHR, BIN_XOR, CEIL, COS, COSH, COT, DATEADD, DATEDIFF, DECODE, EXP, FLOOR, GEN_UUID, HASH, LEFT, LN, LOG, LOG10, LPAD, MAXVALUE, MINVALUE, MOD, OVERLAY, PI, POSITION, POWER, RAND, REPLACE, REVERSE, RIGHT, ROUND, RPAD, SIGN, SIN, SINH, SQRT, TAN, TANH, TRUNC.Compatibilidade de BLOBs com VARCHARsCampos Blobs definidos com subtype 1 (text) e cujo contedo no ultrapasse 32.765 bytes, so agora tratados em diversas situaes como VARCHARs, possibilitando o uso direto em funes de manipulao de strings, converses, concatenaes, etc. O comando abaixo retornaria os 100 primeiros caracteres de um campo blob textual:SELECT SUBSTRING(CAMPO_BLOB FROM 1 FOR 100) FROM TABELA;Domnios em PSQLFinalmente possvel declarar variveis e parmetros em procedures e triggers utilizando domnios, atravs do uso da clusula TYPE OF! Isso vai facilitar muito a padronizao de tipos de informaes referenciadas em tabelas, procedures e triggers. Exemplo:CREATE DOMAIN CEP AS CHAR(9);CREATE DOMAIN CITY AS VARCHAR(50);CREATE PROCEDURE GET_CEP (CEP1 TYPE OF CEP)RETURNS (CIDADE TYPE OF CITY)AS DECLARE VARIABLE XCEP TYPE OF CEP;BEGIN...ConclusoEste artigo apresenta alguns dos novos recursos implementados na verso 2.1 do Firebird. Existem vrios outros recursos que no foram mencionados neste artigo, e que com certeza merecem sua ateno. Para obter mais detalhes sobre os recursos demonstrados aqui, bem como se informar de todas as novidades, leia o release notes (pdf) que acompanha o Firebird. Ele uma rica fonte de exemplos e informaes detalhadas de cada release do SGBD e, sem dvida, uma leitura indispensvel!Carlos H. Cantuwww.firebase.com.brblog.firebase.com.br