2013-03-05 79 views
25

back story: 我们主要使用AWS进行一切(托管,数据库,通知等)。现在,我正在考虑将数据库端移到SQL Azure,因为我们已经在AWS RDS上收到了疯狂的账单。所以我试图做的是在SQL Azure中创建一个数据库,并更新连接字符串以指向新的数据库。过去,ELMAH(这个具体实现:https://github.com/alexanderbeletsky/elmah.mvc)过去完美无瑕。MVC ELMAH和SQL Azure

现状: 我刚刚创建一个新的数据库在SQL Azure中,发现的主要区别就即关于不支持:

ON [PRIMARY],NONCLUSTERED钥匙等

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

我莫名其妙地相信,这是一个分贝问题,因为如果我删除: <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="DefaultConnection"/>基本上默认ELMAH本地存储的一切,我得到访问ELMAH。

有人让ELMAH使用SQL Azure吗?你可以给我SQL脚本来生成表和存储过程吗?

+1

DefaultConnection字符串是什么样子(混淆user/pwd/dbname) – Tommy 2013-03-05 19:08:56

回答

72

这是数据库脚本我使用的数据块ELMAH SQL Azure上:

--~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 Migrate Wizard迁移你的数据库吗?

+0

是的,我尝试使用该工具。在你的SQL脚本中,我有同一个,但无论如何尝试,它stil不起作用。 :( 我真的确定它与数据库,因为如果我删除ELMAH的连接字符串(这意味着它存储日志本地),我进入接口 你有一个单独的连接字符串单独的数据库ELMAH?过去有一个单独的数据库,但现在我只是使用默认连接 – AnimaSola 2013-03-05 16:58:48

+0

您试过了香草版本的ELMAH吗?这可能是实现特定的。 – 2013-03-06 15:30:26

+1

我在使用Azure上的elmah时遇到问题,您的SQL脚本修复了我的问题 – Naz 2013-04-01 15:09:41