1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

VB.NET SQL Server | Trigger ou Procedure?

Discussão em 'Programação' iniciada por diog0silva, 11 de Julho de 2009. (Respostas: 5; Visualizações: 2021)

  1. diog0silva

    diog0silva Power Member

    Boas. Tenho uma aplicação em VB.NET que gere um BD em SQL Server.

    Preciso que, ao inserir um registo na tabela X, insira automaticamente um registo na tabela Y com determinados dados. Neste momento tou a executar dois SqlCommand's: um com a instrução de INSERT na tabela X, outro na tabela Y.

    O problema é que se ocorrer algum erro no INSERT da tabela Y, o INSERT da tabela X já foi executado. E isso não pode acontecer, ou seja, ou insere nas duas tabelas ou não insere em nenhuma.

    Eu pensei numa solução, mas queria saber se vai funcionar antes de alterar o código do programa. Se eu usar apenas um SqlCommand, cuja instrução SQL contém os dois INSERT's separados por ponto e virgula, irei ter o mesmo problema?

    Depois há uma outra solução de certeza, que é recorrer a Triggers ou a Procedures, mas eu aqui não estou nada à vontade.

    Cumprimentos.
     
  2. KiKas

    KiKas Power Member


    já ouviste falar de transacções?

    Antes de trabalhares com bases de dados devias investir algum tempo no estudo das mesmas. A transacção é um conceito basico
     
  3. diog0silva

    diog0silva Power Member

    Sim, já ouvi falar. Alias, o que queria dizer mesmo Transaction e não Trigger lol Mas obrigado pela ajuda, vou estudar um bocado as transacções e se não conseguir resolver o problema volto aqui.

    Só mais uma questão, posso criar uma transacção dentro de um procedure?

    Por exemplo:

    Código:
    CREATE PROCEDURE xpto
     
       @bi INT = NULL
       @produto VARCHAR(20) = NULL
       @data DATE = NULL
     
    AS
    BEGIN
     
       COMMIT;
     
       BEGIN
     
          INSERT INTO tab_x VALUES (@bi, @produto);
     
          INSERT INTO tab_y VALUES (@bi, @data);
     
       END;
     
    END
    
     
  4. AliFromCairo

    AliFromCairo Power Member

    Sim, podes, mas não da forma que escreveste. Não faz qualquer tipo de sentido teres um COMMIT como primeiro statement do teu stored procedure. A estrutura básica é muito simples: iniciar uma transacção; efectuar as operações e verificar a ocorrência de situações anómalas de forma a poderes fazer rollback da transacção; em caso de sucesso, efectuar o commit. Algo do género:

    Código:
    CREATE PROCEDURE sp
    AS
    BEGIN TRANSACTION
    // INSERT, UPDATE, DELETE, et cetera
    IF @ERROR <> 0 // aqui colocas a condição adequada à tua situação
    BEGIN
      ROLLBACK TRANSACTION
      RETURN 1
    END
    COMMIT TRANSACTION
    
    Alternativamente, e uma vez que estás a utilizar ADO.NET, podes simplesmente obter uma instância da classe SqlTransaction e colocares um rollback dentro do bloco catch (SqlException).

    Espero que ajude. Existem imensas soluções diferentes para o teu problema, pelo que podes procurar pela web outras abordagens.
     
  5. diog0silva

    diog0silva Power Member

    Não me consegues dar um exemplo de como o fazer? Ou não conheces nenhuma página na Web com um exemplo?

    Obrigado de qualquer maneira aos dois. Ajudaram bastante.
     
  6. jpaulino

    jpaulino Power Member

    Olá,

    Podes usar a classe SqlTransaction e controlar o que queres, através dos métodos Rollback() e Commit()

    aqui outro exemplo para OleDb, mas que é iguar ao acima indicado.
     

Partilhar esta Página