【问题标题】:How do I create the ELMAH SQL Server database?如何创建 ELMAH SQL Server 数据库?
【发布时间】:2011-12-26 18:46:28
【问题描述】:

如何创建 ELMAH SQL Server 数据库?我通过 NuGet 将它添加到我的 ASP.NET MVC 项目中,并且我的机器上没有 sql 脚本。

【问题讨论】:

    标签: asp.net-mvc elmah nuget


    【解决方案1】:

    Elmah 源代码已移至 GitHub。 SQL Server 的当前文件位于 Elmah 组织下的 SqlErrorLog 存储库中。 SqlErrorLog: /src/SQLServer.sql

    其他数据库脚本可以在 Elmah GitHub 组织下搜索 errorlog 找到。例如https://github.com/elmah?q=errorlog

    【讨论】:

      【解决方案2】:

      DDL 脚本链接自 Elmah downloads page。无需搜索源代码树。

      (为什么它不与 NuGet 捆绑在一起让我无法理解)

      【讨论】:

      • @Brettski:我刚刚安装了Elmah.Mvc 项目(v2.1.1),它没有创建App_Readme 文件夹或任何ddl 脚本。
      • 此页面已不存在 :(
      • 源代码已移至 GitHub。见我的answer
      【解决方案3】:

      对于代码优先迁移方案,我发现this 文章非常有帮助。

      首先在“包管理器控制台”中运行Add-Migration AddElmah 命令。这将在 Migration 文件夹下创建一个文件。该文件将包含AddElmah 类和函数Up()Down()。将这两个函数替换为以下代码:

      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");
      }
      

      现在,当您在“包管理器控制台”中执行Update-Database 命令时,将在数据库中创建ELMAH_Error 表和相关过程。

      【讨论】:

      • 为什么 PK 位于使用 newid() 而不是 newsequentialid() 的 guid 列上,这超出了我的理解。应该在序列列上,不是吗?
      • 我更进一步,使用带有流畅映射的 POCO 来生成表的迁移数据。稍微复杂一点,但也允许直接使用 EF 查询表。
      【解决方案4】:

      我在源代码管理中找到了脚本:https://code.google.com/p/elmah/source/browse/src/Elmah.SqlServer/SQLServer.sql

      在您用来为 Elmah 创建数据库结构的数据库上运行该脚本。

      【讨论】:

      猜你喜欢
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 2012-06-17
      • 1970-01-01
      相关资源
      最近更新 更多