35

How do I create the ELMAH SQL Server database? I added it to my ASP.NET MVC project through NuGet and don't have the sql script on my machine.

David Silva Smith
  • 11,498
  • 11
  • 67
  • 91

4 Answers4

33

The DDL script is linked from the Elmah downloads page. No need to trawl the source tree.

(Why it's not bundled with the NuGet escapes me)

Andy Arndt
  • 385
  • 1
  • 7
piers7
  • 4,174
  • 34
  • 47
23

I found the script in source control: https://code.google.com/p/elmah/source/browse/src/Elmah.SqlServer/SQLServer.sql

Run that script on the database you are using to create the database structures for Elmah.

David Silva Smith
  • 11,498
  • 11
  • 67
  • 91
  • 2
    Can you please fix the link and add a summary? Link-only answers are of little value. – Gert Arnold Jan 23 '14 at 15:42
  • 2
    File no longer exists ! The latest url is https://bitbucket.org/project-elmah/main/downloads/ELMAH-1.2-db-SQLServer.sql – Wiil Feb 20 '18 at 03:07
  • The source code has been moved to GitHub. See my [answer](https://stackoverflow.com/a/63495240/4267686). – Keith Banner Aug 19 '20 at 21:28
1

For a code first migration scenario, I found the this article very helpful.

First run Add-Migration AddElmah command in 'Package Manager Console'. This will create a file under Migration folder. This file will contain AddElmah class with to functions Up() and Down(). Replaced these two functions with below code:

public override void Up()
{
    Sql(@"CREATE TABLE [dbo].[ELMAH_Error]
        (
            [ErrorId]     UNIQUEIDENTIFIER NOT NULL,
            [Application] NVARCHAR(60)  COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
            [Host]        NVARCHAR(50)  COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
            [Type]        NVARCHAR(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
            [Source]      NVARCHAR(60)  COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
            [Message]     NVARCHAR(500) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
            [User]        NVARCHAR(50)  COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
            [StatusCode]  INT NOT NULL,
            [TimeUtc]     DATETIME NOT NULL,
            [Sequence]    INT IDENTITY(1, 1) NOT NULL,
            [AllXml]      NTEXT COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
        ) ");

    Sql("EXEC('ALTER TABLE [dbo].[ELMAH_Error] WITH NOCHECK ADD CONSTRAINT[PK_ELMAH_Error] PRIMARY KEY([ErrorId])')");

    Sql("EXEC('ALTER TABLE [dbo].[ELMAH_Error] ADD CONSTRAINT[DF_ELMAH_Error_ErrorId] DEFAULT(NEWID()) FOR[ErrorId]')");

    Sql(@"EXEC('CREATE NONCLUSTERED INDEX [IX_ELMAH_Error_App_Time_Seq] ON [dbo].[ELMAH_Error] 
        (
            [Application]   ASC,
            [TimeUtc]       DESC,
            [Sequence]      DESC
        )')");

    Sql(@"EXEC('CREATE PROCEDURE [dbo].[ELMAH_GetErrorXml] (@Application NVARCHAR(60), @ErrorId UNIQUEIDENTIFIER) AS
            SET NOCOUNT ON
            SELECT [AllXml] FROM [ELMAH_Error] WHERE [ErrorId] = @ErrorId AND [Application] = @Application')");

    Sql(@"EXEC('CREATE PROCEDURE [dbo].[ELMAH_GetErrorsXml]
        (@Application NVARCHAR(60), @PageIndex INT = 0, @PageSize INT = 15, @TotalCount INT OUTPUT)
        AS  
            SET NOCOUNT ON 
            DECLARE @FirstTimeUTC DATETIME
            DECLARE @FirstSequence INT
            DECLARE @StartRow INT
            DECLARE @StartRowIndex INT

            SELECT @TotalCount = COUNT(1) FROM [ELMAH_Error] WHERE [Application] = @Application

            SET @StartRowIndex = @PageIndex * @PageSize + 1

            IF @StartRowIndex <= @TotalCount
            BEGIN 
                SET ROWCOUNT @StartRowIndex

                SELECT @FirstTimeUTC = [TimeUtc], @FirstSequence = [Sequence] FROM [ELMAH_Error]
                WHERE [Application] = @Application ORDER BY [TimeUtc] DESC, [Sequence] DESC 
            END
            ELSE
            BEGIN 
                SET @PageSize = 0 
            END

            SET ROWCOUNT @PageSize

            SELECT 
                errorId     = [ErrorId], 
                application = [Application],
                host        = [Host], 
                type        = [Type],
                source      = [Source],
                message     = [Message],
                [user]      = [User],
                statusCode  = [StatusCode], 
                time        = CONVERT(VARCHAR(50), [TimeUtc], 126) + ''Z''
            FROM [ELMAH_Error] error WHERE [Application] = @Application AND [TimeUtc] <= @FirstTimeUTC
            AND [Sequence] <= @FirstSequence ORDER BY [TimeUtc] DESC, [Sequence] DESC FOR XML AUTO')");

    Sql(@"EXEC('CREATE PROCEDURE [dbo].[ELMAH_LogError] (@ErrorId UNIQUEIDENTIFIER, @Application NVARCHAR(60), @Host NVARCHAR(30),
          @Type NVARCHAR(100), @Source NVARCHAR(60), @Message NVARCHAR(500), @User NVARCHAR(50), @AllXml NTEXT, @StatusCode INT,
          @TimeUtc DATETIME) AS 

         SET NOCOUNT ON

         INSERT INTO [ELMAH_Error] ([ErrorId], [Application], [Host], [Type], [Source], [Message], [User], [AllXml], [StatusCode], [TimeUtc])
         VALUES (@ErrorId, @Application, @Host, @Type, @Source, @Message, @User, @AllXml, @StatusCode, @TimeUtc)')");
}

public override void Down()
{
    Sql("EXEC('DROP PROCEDURE [ELMAH_GetErrorXml]')");
    Sql("EXEC('DROP PROCEDURE [ELMAH_GetErrorsXml]')");
    Sql("EXEC('DROP PROCEDURE [ELMAH_LogError]')");
    Sql("Drop table ELMAH_Error");
}

Now when you will execute Update-Database command in "Package Manager Console", ELMAH_Error table and associated procedures will be created in the database.

A J Qarshi
  • 2,772
  • 6
  • 37
  • 53
  • 1
    Why the PK is on a guid column using newid() instead of newsequentialid() is beyond me. Should be on Sequence column, no? – Greg Mar 16 '18 at 15:44
  • I went a mile farther and used a POCO with fluent mappings to generate the migration data for the table. A little more complicated, but also allows querying the table directly using EF. – James Haug Nov 15 '19 at 18:06
1

Elmah source has been moved to GitHub. The current file for SQL Server is located in the SqlErrorLog repo under the Elmah organization. SqlErrorLog: /src/SQLServer.sql

Other database scripts can be found by searching errorlog under the Elmah GitHub organization. e.g. https://github.com/elmah?q=errorlog

Keith Banner
  • 602
  • 1
  • 10
  • 15