2

こんにちは、ロールバックに問題があります...Tregerは最初にプロシージャを呼び出すために使用していましたが、プロシージャはロールバックをトリガーしましたが、...今はトリガーからロールバックを実行しようとしています...

コードとエラーを添付

ご協力いただきありがとうございます

USE [Desarrollo_Pruebas]
GO
/****** Object:  Trigger [dbo].[Prueba_tre]    Script Date: 10/30/2012 17:02:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[Prueba_tre] 
   ON  [dbo].[Cliente]
    FOR INSERT
AS 
BEGIN

 SET NOCOUNT ON;

begin try
    BEGIN TRAN t1
    SAVE TRAN t1
    INSERT INTO Articulo (Articulo_Codigo, Articulo_Descripcion, Valor_unitario, Categoria_id, msg) VALUES (1040,'EURECA',15000,5,'')
    COMMIT 
    --raiserror ('Test error',16,1)
end try

begin catch
    ROLLBACK TRAN t1
    SELECT    ERROR_NUMBER() AS ERROR_NUMBER, ERROR_MESSAGE() AS ERROR_MESSAGE;
end catch

--SET NOCOUNT ON;
--exec Prueba CLIENTE_ID;

END

メッセージ 3931、レベル 16、状態 1、プロシージャ Prueba_tre、行 21 現在のトランザクションをコミットできず、セーブポイントにロールバックできません。トランザクション全体をロールバックします。

テーブルは

アイデアは、挿入更新を使用して顧客の製品に挿入するとき..このトランザクションの最後にコンソールから戻る必要があるということです

CREATE TABLE Articulo
(
   Articulo_Codigo int not null primary key
   , Articulo_Descripcion varchar (100)
   , Valor_unitario int
   , Categoria_Id int not null constraint fk_Categoria references Categoria (CATEGORIA_ID)
)

CREATE TABLE Cliente
(
   CLIENTE_ID int not null primary key
   , CLIENTE_PRIMER_NOMBRE varchar(50)
   , CLIENTE_SEGUNDO_NOMBRE varchar(50)
   , CLIENTE_PRIMER_APELLI varchar(50)
   , CLIENTE_SEGUNDO_APELLI varchar(50)
   , CLIENTE_DIRECCION varchar(90)
   , CLIENTE_TELEFONO int
   , CLIENTE_CIUDAD varchar(50)
)
4

1 に答える 1

0

手順を使用し続けます。例外処理とネストされたトランザクションをチェックしていないと思います。

CREATE PROCEDURE [dbo].[Prueba_tre]
AS
BEGIN
  SET NOCOUNT ON;
  declare @trancount int;
  set @trancount = @@trancount;
  begin try
    if @trancount = 0
      begin transaction
    else
      save transaction t1

    INSERT INTO Articulo (Articulo_Codigo, Articulo_Descripcion, Valor_unitario, Categoria_id, msg) VALUES (1040,'EURECA',15000,5,'')
    if @trancount = 0 
      commit; 
  end try
  begin catch
    declare @error int, @message varchar(4000 ), @xstate int;
    select @error = ERROR_NUMBER(),
    @message = ERROR_MESSAGE(),
    @xstate = XACT_STATE();
   if @xstate = -1
     rollback;
   if @xstate = 1 and @trancount = 0
     rollback
   if @xstate = 1 and @trancount > 0
     rollback transaction t1
   raiserror ('t1: %d: %s' , 16, 1, @error, @message)
  end catch
END
于 2012-10-31T08:45:31.890 に答える