2013-03-05 11 views
25

zurückgeschichte: Wir verwenden hauptsächlich AWS für alles (Hosting, Datenbank, Benachrichtigungen, etc.). Jetzt versuche ich, die Datenbankseite auf SQL Azure zu verschieben, da wir auf AWS RDS verrückte Rechnungen erhalten. Alles, was ich zu tun versuchte, war, eine Datenbank in SQL Azure zu erstellen und die Verbindungszeichenfolge zu aktualisieren, um auf die neue Datenbank zu verweisen. In der Vergangenheit hat ELMAH (diese spezifische Implementierung: https://github.com/alexanderbeletsky/elmah.mvc) in der Vergangenheit einwandfrei funktioniert.MVC ELMAH und SQL Azure

aktuelle Situation: Ich habe gerade einen neuen DB in SQL Azure und bemerkte wichtigste Unterschiede sofort nämlich nicht unterstützt:

ON [PRIMARY], NONCLUSTERED Schlüssel usw.

Ich wanderte meine db Gut (für jetzt), aber als ich die aktualisierten Skripte für ELMAH auf die db angewendet und versucht habe, in das Tool zu gehen, erhalte ich Fehler!

Ich bin irgendwie überzeugt, dass es ein Problem db, denn wenn ich zu entfernen: <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="DefaultConnection"/> die im Grunde defaults ELMAH alles lokal zu speichern, erhalte ich ELMAH zuzugreifen.

Hat jemand ELMAH an SQL Azure arbeiten? Können Sie mir das SQL-Skript geben, um die Tabellen und gespeicherten Prozeduren zu generieren?

+1

Wie sieht die DefaultConnection-Zeichenfolge aus (obfuscate user/pwd/dbname) – Tommy

Antwort

72

Dies ist der db Skript, das ich für ELMAH DBs verwenden auf 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 eine spezielle Version von SQL ist und es gibt einige Dinge, die es gewohnt Unterstützung.

Haben Sie den SQL Azure Migrate-Assistenten zum Migrieren Ihrer Datenbank verwendet?

+0

Ja, ich habe versucht, das Tool zu verwenden. Auf Deinem SQL Script habe ich das selbe aber trotzdem versucht und es funktioniert immer noch nicht. :( Ich bin mir wirklich sicher, dass es mit der db ist, wenn ich die connectionString für ELMAH entferne (was bedeutet, dass es Protokolle lokal speichert), bekomme ich in die Schnittstelle. Haben Sie ELMAH auf einem separaten DB mit einer separaten Verbindungszeichenfolge? Früher hatte ich eine separate DB, aber jetzt benutze ich einfach die defaultconnection – AnimaSola

+0

Haben Sie versucht eine Vanilla-Version von ELMAH ?? Das könnte Implementation specific. –

+1

Ich hatte Probleme mit Elmah auf Azure Ihr SQL-Skript hat es für mich behoben – Naz