私は2つのことを行うストアドプロシージャを本番環境に持っています。1 つのテーブルを更新してから、レコードを別のテーブルに挿入します。最初のステップ (更新) は発生しているように見えますが、データを調べると、2 番目のステップが発生しなかったインスタンスが見つかりました。データを見て、データの問題ではないことを確認しました。クエリが完了し、通常の状況では両方が実行されることを確認するために、クエリが適切なデータを返すことを確認しました。おそらく何らかのパフォーマンスの問題があるかどうかはわかりません...または2番目のステップで発生しているブロックの問題が、そのステップの発生を妨げています。
ストアド プロシージャのエラー処理は次のとおりです。
BEGIN TRY
BEGIN TRANSACTION;
-- perform update to data
-- insert record into second table.
IF ( @@ERROR = 0 AND @@TRANCOUNT > 0 )
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF ( @@TRANCOUNT > 0 )
BEGIN
ROLLBACK TRANSACTION;
END
DECLARE @WebSafeErrorId INT;
EXEC dbo.spErrorInsert @WebSafeErrorId OUTPUT, 'Proc';
-- Reraise the error back to the client.
IF ( @WebSafeErrorId != 0 )
BEGIN
DECLARE @Error VARCHAR(20);
SET @Error = CAST( @WebSafeErrorId AS VARCHAR(20) );
RAISERROR( @Error, 11, 1 );
END
ELSE
BEGIN
RAISERROR( 'An error has occurred but there is no error to log.', 11, 1 );
END
END CATCH;
確かに、挿入が発生しない原因となるエラーがこのプロシージャで発生した場合は、ログに記録されてから発生します。spErrorInsert のコードは以下のとおりです...
CREATE PROCEDURE [dbo].[spErrorInsert]
@ReturnErrorId INT OUTPUT
, @ErrorSourceType VARCHAR(4) = NULL
, @ParentErrorId INT = NULL
, @StackTrace VARCHAR(MAX) = NULL
AS
SET NOCOUNT ON;
--SET XACT_ABORT ON;
-- Will indicate an error was not logged.
SET @ReturnErrorID = 0;
DECLARE
@ErrorSource VARCHAR(200)
, @ErrorMessage VARCHAR(MAX)
, @ComposedErrorMessage VARCHAR(MAX)
, @ErrorLine INT
, @ErrorSeverity INT
, @ErrorState INT
, @ErrorNumber INT;
SET @ErrorSource = ERROR_PROCEDURE();
SET @ErrorMessage = ERROR_MESSAGE();
SET @ErrorLine = ERROR_LINE();
SET @ErrorSeverity = ERROR_SEVERITY();
SET @ErrorState = ERROR_STATE();
SET @ErrorNumber = ERROR_NUMBER();
SET @ComposedErrorMessage = 'Message: Error occurred in procedure ' + CAST( @ErrorSource AS VARCHAR(MAX) )
+ ' on line ' + CAST( @ErrorLine AS VARCHAR(MAX) )
+ '. Error: ' + @ErrorMessage;
BEGIN TRY
INSERT INTO Errors(
ParentId
, ErrorSourceType
, ErrorSource
, [Message]
, [LineNo]
, Severity
, Stacktrace
, ts)
VALUES (@ParentErrorId
, @ErrorSourceType --@ErrorSourceType --- NOTE: move this into a parameter ...
, @ErrorSource
, @ComposedErrorMessage
, @ErrorLine
, @ErrorState
, @Stacktrace
, GETDATE()
);
SET @ReturnErrorId = SCOPE_IDENTITY();
END TRY
BEGIN CATCH
RAISERROR( 'An error has occurred but there is no error to log.', 11, 1 );
END CATCH;
特定のプロシージャが呼び出された特定の時間にデータベースで何が起こっているかのスナップショットを取得する方法があるかどうかはわかりません...何かが起こっていないかどうかを判断する方法がわかりませんしたほうがいい?利用できるツールや、知らないSQL機能はありますか???