Array
(
)

Transação interrompida entre Delphi 6 e SQL Server 2005

Duw
   - 13 nov 2006

Olá pessoal,

Estou com um problema estranho, e não tenho idéia ainda de como resolver, por isso peço ajuda de vocês aqui do fórum. É o seguinte:

Tenho um software desenvolvido em Delphi 6, conectando a uma base de dados SQL 2005 (porém, com nível de compatibilidade de SQL 2000), através da BDE. Ele realiza diversas operações, e o problema é quando vou tentar inserir uma linha em uma tabela ´grande´ (aprox. 2 milhões de registros e umas 20 colunas).

Esta inserção está dentro de uma transação, portanto, se ela falhar, o procedimento comum é o banco de dados dar o erro de PK e eu tratar isso no except do try que coloquei junto à inserção. Quando eu vou tratar o erro, faço mais alguns procedimentos de banco de dados (inserts) e depois vou ´commitar´ minha transação.

Ao ´commitar´, o Delphi me diz que não existe transação ativa, apesar de a flag InTransaction de meu componente Database estar True.

Agora o mais louco: se eu troco o trecho de código que faz a inserção de dados na tabela grande, gerando erro de PK, por outro código que faz alguma inserção simples em uma tabela pequena, também gerando erro de PK, tudo funciona. Obviamente ele não consegue inserir o registro, mas as rotinas que faço no except são executadas tranquilamente, e consigo ´commitar´ a transação.

Alguém já teve problema parecido? O que posso tentar? Alguma sugestão / solução :?: :?: :?:

Obrigado!,
Eduardo

Ramms
   - 14 nov 2006

Amigo creio que esse problema seja do Delphi, já que vc abre transação no seu componente, não no SQL Server, pergunte na área de Delphi que poderá ter mais respostas.

Duw
   - 14 nov 2006

Na verdade achei o problema pesquisando mais sobre SQL Server. O erro acontece pois tenho uma trigger INSTEAD OF na tabela grande, e é nela que tenho o INSERT propriamente dito.

Quando o SQL Server roda a trigger e gera o erro de FK, ele dá rollback em uma transação implícita criada por ele mesmo para a trigger, e, segundo a documentação, deveria ser só isso.

Mas na prática ele está dando rollback também na transação que iniciei via o aplicativo, deixando ele em um estado inconsistente. Vou tentar mudar a trigger para AFTER INSERT, e ver se consigo resolver assim...

Abraço,
Eduardo