[firebase-br] Stored Procedure

paulosxs Yahoo! paulosxs em yahoo.com.br
Sáb Jul 21 15:51:07 -03 2007


Prezado Sérgio, quanto à estratégia (usar SPs como camada) eu sou da 
mesma opinião, e, como já disse, é assim que procedo. Quanto à 
prioridade de alteração de registros pelos usuários, realmente há o 
risco de uma alteração de um usuário anular a alteração de outro 
ocorrida imediatamente antes. Mas, nesse caso, a questão é mais de 
arquitetura operacional do sistema. Isto é, se ambos os usuários 
possuírem permissão para a alteração de um mesmo registro, o sistema 
manterá o último a ter alterado. Três métodos que sugiro para amenizar 
este problema são:
1. Feedback: Após a alteração, o sistema exibe o que foi alterado. Nesse 
caso, a responsabilidade de checar a alteração é passada para o usuário.
2. Log: Antes de alterar, o sistema verifica se outro usuário alterou o 
registro há menos de X minutos (isso é feito a partir de um log de 
eventos). Nesse caso, o sistema retorna uma mensagem indicando que o 
registro foi recentemente alterado por outro usuário.
3. Status: Há atualizações que naturalmente protegem o registro na 
alteração da sua situação. Por exemplo, em uma agenda, dois usuários 
tentam agendar um mesmo horário. Quando o primeiro usuário reserva o 
horário, este fica automaticamente protegido para novos agendamento, 
originando um bloqueio para o segundo usuário.

> Date: Fri, 20 Jul 2007 20:09:26 -0300
> From: Sérgio Luiz Krüger <sergio.luiz.kruger em gmail.com>
> Subject: Re: [firebase-br] Stored Procedure
> To: "FireBase" <lista em firebase.com.br>
> Message-ID: <008e01c7cb23$0e791a60$3200a8c0 em SERGIO>
> Content-Type: text/plain; format=flowed; charset="iso-8859-1";
> 	reply-type=original
>
>
>     Boa noite,
>
>     Obrigado pela ajuda, mas como voce controla na procedure update o caso 
> de duas estações estarem alterando o mesmo registro ? Se eu fizer uma 
> procedure update simples atualizando todos os campos que foram 
> acessados/alterados por uma estação, corro o risco de perder dados que foram 
> alterados em outra estação. É feito algum lock quando o usuário começa a 
> alterar o registro na tela ? Ou vc passa os valores antigos e novos para a 
> stored procedure gerar um comando update apenas do que foi alterado pelo 
> usuário ?
>
>     O que eu estou querendo fazer é criar uma "camada" de procedimentos no 
> banco de dados pra fazer manutenção em suas tabelas, tirando o máximo 
> possível a dependência de componentes e evitando assim de ter que ficar 
> escrevendo SQL dentro da aplicação. Fazendo dessa forma, acredito que a 
> aplicação poderia ser feita em Delphi, .Net, Java, etc, desde que a 
> linguagem suporte execução de stored procedures e ficando dessa forma, 
> padronizado o acesso aos dados. O problema é que eu não sei qual o padrão 
> que o pessoal utiliza, e tenho medo de começar a escrever código e no meio 
> do projeto, ter que alterar tudo.
>
>     Já pesquisei na net e existem casos onde os programadores efetuam um 
> select for update quando entram em modo de alteração do registro nas 
> estações, mantendo o registro "lockado" durante a fase de edição, evitando 
> assim o problema de duas pessoas alterando o mesmo registro, porém não sei 
> se essa é uma boa idéia.
>
>     Também encontrei casos onde é criada uma coluna timestamp na tabela que 
> é alimentada via trigger e na stored procedure update essa coluna é checada 
> na
> cláusula where a fim de saber se o registro foi editado por outra estação 
> enquanto voce estava alterando-o, fazendo com que o update falhe e o usuário 
> seja obrigado a reiniciar a transação.
>
>     Sei que devem existir outras formas de se fazer isso, mas eu gostaria de 
> saber quais são as melhores práticas, seus pontos a favor e contra pra poder 
> adotar uma delas e tocar o projeto.
>
>     Acredito que a maioria aqui usa Delphi pra acessar o Firebird. Será que 
> todo mundo usa escrever SQL dentro de componentes ? Essa é realmente a 
> melhor prática ? Se quiserem passar pra Java ou mesmo trocar de banco de 
> dados, reescrevem todo o SQL dentro de componentes de novo ?
>
>     Desculpe-me pelo longo e-mail, mas é que trabalho atualmente com Visual 
> Dataflex, e estou tentando converter minhas aplicações para banco de dados, 
> e já estou cançado de ficar dependente de uma linguagem ou banco, por isso, 
> procuro uma forma de fazer com que as coisas fiquem mais portáveis e 
> independentes uma da outra.
>
>     Abraços.
>
>     Sérgio Luiz Krüger
>
>
> ----- Original Message ----- 
> From: "paulosxs Yahoo!" <paulosxs em yahoo.com.br>
> To: <lista em firebase.com.br>
> Sent: Friday, July 20, 2007 7:05 PM
> Subject: Re: [firebase-br] Stored Procedure
>
>
> Em meus aplicativos adotei como padrão a interface com o BD sempre
> através de procedures. No caso dos componentes que utilizo, a transação
> é controlada automaticamente durante a execução da procedure. Quando se
> trata de uma procedure com um comando simples, os locks são gerenciados
> internamente pelo Fb. Pode ocorrer algum problema no caso de procedures
> complexas, que envolvam atualizações em várias tabelas, mas mesmo nesses
> casos nunca precisei me procupar com os locks.
>
>   
>> Date: Fri, 20 Jul 2007 09:54:17 -0300
>> From: Sérgio Luiz Krüger <sergio.luiz.kruger em gmail.com>
>> Subject: [firebase-br] Stored Procedure
>> To: "FireBase" <lista em firebase.com.br>
>> Message-ID: <004201c7cacd$1879cb50$3200a8c0 em SERGIO>
>> Content-Type: text/plain; charset="iso-8859-1"
>>
>>     Bom dia,
>>
>>     Algúem da lista utiliza stored procedures para fazer 
>> insert/update/delete ?
>>
>>     Como funciona no caso do update ? É utilizada alguma forma de lock de 
>> registro antes de executar a stored procedure update ou a lógica de 
>> tratamento multi-usuários é tratada dentro da própria stored procedure ?
>>
>>     Alguém poderia comentar as suas experiências ou ajudar com algum 
>> exemplo ?
>>
>>     Obrigado.
>>
>>     Sérgio Luiz Kruger
>>     





Mais detalhes sobre a lista de discussão lista