2013-03-05 1 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 ключей и т.д.

Я мигрировали мой дб fine (на данный момент), но когда я применил обновленные скрипты для ELMAH к db и попытался войти в инструмент, я получаю ошибки!

Я почему-то уверен, что это проблема дб, потому что если я удалю: <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="DefaultConnection"/>, которые в основном по умолчанию ELMAH хранить все локально, я получаю доступ к ELMAH.

У кого-нибудь есть ELMAH для работы с SQL Azure? Не могли бы вы дать мне сценарий SQL для создания таблиц и хранимых процедур?

+1

Что представляет строка DefaultConnection (obfuscate user/pwd/dbname) – Tommy

ответ

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 и есть некоторые вещи, которые он не будет поддержки.

Использовал ли вы Мастер миграции Azure для миграции вашего db?

+0

Да, я попытался использовать этот инструмент. На вашем SQL-скрипте у меня был тот же, но я все равно пытался, и он не работает. :( Я действительно уверен, что это с db, потому что если я удалю connectionString для ELMAH (это значит, что он хранит журналы локально), я попадаю в интерфейс. У вас есть ELMAH на отдельной БД с отдельной строкой соединения? Раньше у меня была отдельная БД, но теперь я просто использую соединение по умолчанию. – AnimaSola

+0

Пробовали ли вы ванильную версию ELMAH? Это может быть конкретная реализация. –

+1

У меня возникли проблемы с использованием elmah на Azure, SQL-код исправил это для меня. – Naz

 Смежные вопросы

  • Нет связанных вопросов^_^