背景故事:
我们主要使用AWS进行一切(托管,数据库,通知等)。现在,我正在考虑将数据库端移动到sql Azure,因为我们在AWS RDS上获得了疯狂的账单。所以我试图做的是在sql Azure中创建一个DB,并更新连接字符串以指向新的DB。过去,ELMAH(这个具体实施: https://github.com/alexanderbeletsky/elmah.mvc)过去工作完美无缺。
我们主要使用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。
解决方法
这是我在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