2009-06-24 32 views
1

私は単にストアドプロシージャを実行するSQLジョブを持っています。ジョブを実行しようとする毎朝、次のエラーが発生します。

現在のトランザクションはコミットできず、ログファイルに書き込む操作をサポートできません。SQLトランザクションログに問題があるジョブ

ジョブを再開しようとすると、同じエラーが表示され続けます。しかし、私はちょうどジョブを使用せずにストアの手順を実行する場合、それは正常に動作します。

これは本当に難しい部分です。ストアドプロシージャを実行してキャンセルしてからジョブを実行すると、ジョブは正常に機能します。

誰かがこの独特の問題に遭遇したことがありますか、それを引き起こしている可能性のあるアイディアがありますか?

+0

あなたは、プロシージャのコードを投稿することができます。 –

+0

本当にありません。それはかなり長いプロセスです。ちょうど私が困惑している部分は、プロシージャ自体を実行する際に問題が発生しない理由ですが、エージェントには問題があります。そして、エージェントは私がそれを実行した後にそれを実行することができます。 –

答えて

3

このエラーは、破損したトランザクション中にログ操作を実行しようとしていることを示します。あなたが-1のXACT_STATE値を無視している場合にのみBEGIN CATCHブロックで発生することができます

The current request has an active user transaction, but an error has occurred that has caused the transaction to be classified as an uncommittable transaction. The request cannot commit the transaction or roll back to a savepoint; it can only request a full rollback of the transaction. The request cannot perform any write operations until it rolls back the transaction. The request can only perform read operations until it rolls back the transaction. After the transaction has been rolled back, the request can perform both read and write operations and can begin a new transaction.

は、あなたがこれをやろうとしているという事実は、単に他の言葉で(自分の例外処理を使用してコードの問題を示し、あなたの手続きはバグです)。私は最近a template for procedures that use BEGIN TRY/BEGIN CATCHについてブログに書きました。あなたの手続きを修正するための出発点としてそれを使用することができます。 Erland Sommarskogにはa well known article on Transact-SQL error handlingがありますが、BEGIN TRY/BEGIN CATCHについてはあまり深くは扱っていません。

適切なエラー処理を実行すると、元のエラーが発生し、キャッチブロックが最初に実行されます。プロシージャを手動で実行すると問題は発生しないことに言及しているので、問題はSQL Agentジョブと手動実行の間のコンテキストの違いが考えられます。データがなくても問題を診断することはできませんが、最も可能性の高い原因はセキュリティコンテキストの違いです(つまり、エージェントのログインには独自のログイン権がありません)。

+0

最初の記事はOKですが、もっと良い方法があると思います。私または私のMVPの同僚がすぐに記事を投稿する – gbn

1

私は、さまざまな条件の下で、このエラーを得ていたと私は(ソフトウェアの欠陥がIF XACT_STATE() != 1 ROLLBACKが欠落している)の短いレプリケーションパスでアップが来た:

-- prepare SP 

IF OBJECT_ID(N'ShortReplicationPath',N'P') IS NOT NULL  DROP PROCEDURE dbo.ShortReplicationPath 
GO 

CREATE PROCEDURE dbo.ShortReplicationPath 
AS 

BEGIN 
    BEGIN TRY 

     insert #TempTabDateTime (ValidFrom) Values ('date') 

    END TRY 

    BEGIN CATCH 

     PRINT ERROR_NUMBER();  PRINT ERROR_MESSAGE(); 

    INSERT INTO  #TempTabVarChar 
    (  Text ) 
    VALUES (  'abcdefg' ) 

    END CATCH 

END 

GO 

-- Execute test: 

IF OBJECT_ID ('TEMPDB..#TempTabDateTime') IS NOT NULL drop table #TempTabDateTime 

create table #TempTabDateTime (ValidFrom DATETIME) 

IF OBJECT_ID ('TEMPDB..#TempTabVarChar') IS NOT NULL drop table #TempTabVarChar 

create table #TempTabVarChar (Text VarChar(MAX)) 

BEGIN TRANSACTION 

    EXEC dbo.ShortReplicationPath 
ROLLBACK 

GO 
関連する問題