加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – MVC ELMAH和SQL Azure

发布时间:2020-12-15 18:48:38 所属栏目:asp.Net 来源:网络整理
导读:背景故事: 我们主要使用AWS进行一切(托管,数据库,通知等)。现在,我正在考虑将数据库端移动到SQL Azure,因为我们在AWS RDS上获得了疯狂的账单。所以我试图做的是在SQL Azure中创建一个DB,并更新连接字符串以指向新的DB。过去,ELMAH(这个具体实施: htt
背景故事:
我们主要使用AWS进行一切(托管,数据库,通知等)。现在,我正在考虑将数据库端移动到SQL Azure,因为我们在AWS RDS上获得了疯狂的账单。所以我试图做的是在SQL Azure中创建一个DB,并更新连接字符串以指向新的DB。过去,ELMAH(这个具体实施: https://github.com/alexanderbeletsky/elmah.mvc)过去工作完美无缺。

现在的情况:
我刚刚在SQL Azure中创建了一个新的DB,并注意到关键的差异,即不支持:

ON [PRIMARY],NONCLUSTERED KEYS等

我迁移了我的数据库(现在),但是当我将更新的ELMAH脚本应用到数据库并试图进入该工具时,我会收到错误!

我以某种方式相信这是一个数据库问题,因为如果我删除:
< errorLog type =“Elmah.SqlErrorLog,Elmah”connectionStringName =“DefaultConnection”/>它基本上默认ELMAH来存储本地的所有东西,我可以访问ELMAH。

任何有ELMAH工作的SQL Azure?你能给我SQL脚本生成表和存储过程吗?

解决方法

这是我在SQl Azure上用于ELMAH DB的db脚本:
--~Changing index [dbo].[ELMAH_Error].PK_ELMAH_Error to a clustered index.  You may    want to pick a different index to cluster on.
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
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)
GO
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

GO
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
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
GO
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
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
GO
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
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
GO

SQL Azure是SQL的特殊版本,有一些它不支持的东西。

您是否使用SQL Azure迁移向导来迁移数据库?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读