2012-10-30 100 views
2

下午好, 我有一個回滾的問題... Treger最初是用來調用過程和過程被觸發回滾,但它是... 現在我試圖做從觸發回退,也不...PROBLEMA SQL SERVER ROLLBACK觸發器

連接代碼和錯誤

感謝您的幫助

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) 
) 
+0

保存交易丟掉東西。看看這個http://msdn.microsoft.com/en-us/library/ms188378.aspx – AJP

回答

0

Сontinue使用過程中返回。我認爲你只是不檢查異常處理和嵌套事務。

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