-
-
Save kevinblake/046a440f39f1d1097a17 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public partial class Elmah : DbMigration | |
{ | |
public override void Up() | |
{ | |
Sql(CreateTable_ELMAH_Error); | |
Sql(CreatreProcedure_ELMAH_GetErrorXml); | |
Sql(CreateProcedure_ELMAH_GetErrorsXml); | |
Sql(CreateProcedure_ELMAH_LogError); | |
} | |
public override void Down() | |
{ | |
Sql(DropProcedures); | |
Sql(DropTable_ELMAH_Error); | |
} | |
private const string CreateTable_ELMAH_Error = @" | |
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 | |
) | |
ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] | |
ALTER TABLE [dbo].[ELMAH_Error] WITH NOCHECK ADD | |
CONSTRAINT [PK_ELMAH_Error] PRIMARY KEY NONCLUSTERED ([ErrorId]) ON [PRIMARY] | |
ALTER TABLE [dbo].[ELMAH_Error] ADD | |
CONSTRAINT [DF_ELMAH_Error_ErrorId] DEFAULT (NEWID()) FOR [ErrorId] | |
CREATE NONCLUSTERED INDEX [IX_ELMAH_Error_App_Time_Seq] ON [dbo].[ELMAH_Error] | |
( | |
[Application] ASC, | |
[TimeUtc] DESC, | |
[Sequence] DESC | |
) | |
ON [PRIMARY] | |
"; | |
private const string CreatreProcedure_ELMAH_GetErrorXml = @" | |
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 | |
"; | |
private const string CreateProcedure_ELMAH_GetErrorsXml = @" | |
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 | |
-- Get the ID of the first error for the requested page | |
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 | |
-- Now set the row count to the requested page size and get | |
-- all records below it for the pertaining application. | |
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 | |
"; | |
private const string CreateProcedure_ELMAH_LogError = @" | |
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 | |
) | |
"; | |
private const string DropProcedures = @" | |
DROP PROCEDURE [dbo].[ELMAH_GetErrorXml] | |
DROP PROCEDURE [dbo].[ELMAH_GetErrorsXml] | |
DROP PROCEDURE [dbo].[ELMAH_LogError] | |
"; | |
private const string DropTable_ELMAH_Error = @" | |
DROP INDEX [IX_ELMAH_Error_App_Time_Seq] ON [dbo].[ELMAH_Error] | |
ALTER TABLE [dbo].[ELMAH_Error] DROP CONSTRAINT [DF_ELMAH_Error_ErrorId] | |
ALTER TABLE [dbo].[ELMAH_Error] DROP CONSTRAINT [PK_ELMAH_Error] | |
DROP TABLE [dbo].[ELMAH_Error] | |
"; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SQL script by Roberto Bonini | |
// http://stackoverflow.com/questions/15228112/mvc-elmah-and-sql-azure | |
public partial class ElmahAzure : DbMigration | |
{ | |
public override void Up() | |
{ | |
// Create Tables | |
Sql(CreateTable_ELMAH_Error); | |
// Create Procedures | |
Sql(CreateProcedure_ELMAH_GetErrorsXml); | |
Sql(CreatreProcedure_ELMAH_GetErrorXml); | |
Sql(CreateProcedure_ELMAH_LogError); | |
} | |
public override void Down() | |
{ | |
Sql(DropProcedures); | |
Sql(DropTable_ELMAH_Error); | |
} | |
private const string CreateTable_ELMAH_Error = @" | |
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo]. [ELMAH_Error]') AND type in (N'U')) | |
BEGIN | |
CREATE TABLE [dbo].[ELMAH_Error]( | |
[ErrorId] [uniqueidentifier] NOT NULL, | |
[Application] [nvarchar](60) NOT NULL, | |
[Host] [nvarchar](50) NOT NULL, | |
[Type] [nvarchar](100) NOT NULL, | |
[Source] [nvarchar](60) NOT NULL, | |
[Message] [nvarchar](500) NOT NULL, | |
[User] [nvarchar](50) NOT NULL, | |
[StatusCode] [int] NOT NULL, | |
[TimeUtc] [datetime] NOT NULL, | |
[Sequence] [int] IDENTITY(1,1) NOT NULL, | |
[AllXml] [nvarchar](max) NOT NULL, | |
CONSTRAINT [PK_ELMAH_Error] PRIMARY KEY CLUSTERED | |
( | |
[ErrorId] ASC | |
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) | |
) | |
END | |
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[ELMAH_Error]') AND name = N'IX_ELMAH_Error_App_Time_Seq') | |
CREATE NONCLUSTERED INDEX [IX_ELMAH_Error_App_Time_Seq] ON [dbo].[ELMAH_Error] | |
( | |
[Application] ASC, | |
[TimeUtc] DESC, | |
[Sequence] DESC | |
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) | |
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[DF_ELMAH_Error_ErrorId]') AND type = 'D') | |
BEGIN | |
ALTER TABLE [dbo].[ELMAH_Error] ADD CONSTRAINT [DF_ELMAH_Error_ErrorId] DEFAULT (newid()) FOR [ErrorId] | |
END | |
"; | |
private const string CreatreProcedure_ELMAH_GetErrorXml = @" | |
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ELMAH_GetErrorXml]') AND type in (N'P', N'PC')) | |
BEGIN | |
EXEC dbo.sp_executesql @statement = N' | |
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 | |
' | |
END | |
"; | |
private const string CreateProcedure_ELMAH_GetErrorsXml = @" | |
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ELMAH_GetErrorsXml]') AND type in (N'P', N'PC')) | |
BEGIN | |
EXEC dbo.sp_executesql @statement = N' | |
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 | |
-- Get the ID of the first error for the requested page | |
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 | |
-- Now set the row count to the requested page size and get | |
-- all records below it for the pertaining application. | |
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 | |
' | |
END | |
"; | |
private const string CreateProcedure_ELMAH_LogError = @" | |
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo]. [ELMAH_LogError]') AND type in (N'P', N'PC')) | |
BEGIN | |
EXEC dbo.sp_executesql @statement = N' | |
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 NVARCHAR(MAX), | |
@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 | |
) | |
' | |
END | |
"; | |
private const string DropProcedures = @" | |
DROP PROCEDURE [dbo].[ELMAH_GetErrorsXml] | |
DROP PROCEDURE [dbo].[ELMAH_GetErrorXml] | |
DROP PROCEDURE [dbo].[ELMAH_LogError] | |
"; | |
private const string DropTable_ELMAH_Error = @" | |
DROP INDEX [IX_ELMAH_Error_App_Time_Seq] ON [dbo].[ELMAH_Error] | |
ALTER TABLE [dbo].[ELMAH_Error] DROP CONSTRAINT [DF_ELMAH_Error_ErrorId] | |
ALTER TABLE [dbo].[ELMAH_Error] DROP CONSTRAINT [PK_ELMAH_Error] | |
DROP TABLE [dbo].[ELMAH_Error] | |
"; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment