﻿IF OBJECT_ID('auditlog.ErrorLog') IS NOT NULL
  DROP TABLE [auditlog].[ErrorLog];
GO

CREATE TABLE [auditlog].[ErrorLog](
	[ErrorLogID] [int] IDENTITY(1,1) NOT NULL,
	[ErrorTime] [datetime] NOT NULL,
	[UserName] [sysname] NOT NULL,
	[ErrorNumber] [int] NOT NULL,
	[ErrorSeverity] [int] NULL,
	[ErrorState] [int] NULL,
	[ErrorProcedure] [nvarchar](126) NULL,
	[ErrorLine] [int] NULL,
	[ErrorMessage] [nvarchar](4000) NOT NULL,
  CONSTRAINT [PK_ErrorLog_ErrorLogID] PRIMARY KEY CLUSTERED ([ErrorLogID] ASC)
)
GO

ALTER TABLE [auditlog].[ErrorLog] 
  ADD CONSTRAINT [DF_ErrorLog_ErrorTime] 
  DEFAULT (getdate()) FOR [ErrorTime]
GO

IF OBJECT_ID('auditlog.uspLogError') IS NOT NULL
  DROP PROCEDURE [auditlog].[uspLogError];
GO

CREATE PROCEDURE [auditlog].[uspLogError] 
  @ErrorLogID int = 0 OUTPUT -- contains the ErrorLogID of the row inserted
AS                               -- by uspLogError in the ErrorLog table
BEGIN
  SET NOCOUNT ON;

  -- Output parameter value of 0 indicates that error 
  -- information was not logged
  SET @ErrorLogID = 0;

  BEGIN TRY
      -- Return if there is no error information to log
    IF ERROR_NUMBER() IS NULL
      RETURN;

    -- Return if inside an uncommittable transaction.
    -- Data insertion/modification is not allowed when 
    -- a transaction is in an uncommittable state.
    IF XACT_STATE() = -1 BEGIN
      PRINT 'Cannot log error since the current transaction is in an uncommittable state. ' 
        + 'Rollback the transaction before executing uspLogError in order to successfully log error information.';
      RETURN;
    END

    INSERT [auditlog].[ErrorLog] (
      [UserName], 
      [ErrorNumber], 
      [ErrorSeverity], 
      [ErrorState], 
      [ErrorProcedure], 
      [ErrorLine], 
      [ErrorMessage]
    ) VALUES (
      CONVERT(sysname, CURRENT_USER), 
      ERROR_NUMBER(),
      ERROR_SEVERITY(),
      ERROR_STATE(),
      ERROR_PROCEDURE(),
      ERROR_LINE(),
      ERROR_MESSAGE()
    );

      -- Pass back the ErrorLogID of the row inserted
    SET @ErrorLogID = @@IDENTITY;
  END TRY
  BEGIN CATCH
    PRINT 'An error occurred in stored procedure uspLogError: ';
    RAISERROR('Error during logging an error by uspLogError', 16, 1) WITH LOG;
    RETURN -1;
  END CATCH
END;
GO

IF OBJECT_ID('auditlog.AuditServiceFailedItems') IS NOT NULL
    DROP TABLE [auditlog].[AuditServiceFailedItems];
GO

CREATE TABLE [auditlog].[AuditServiceFailedItems] (
  [conversation_handle] uniqueidentifier,
	[message_body] nvarchar(max),
	[EventDate] datetime DEFAULT CURRENT_TIMESTAMP
);
GO



