﻿/****** Object:  Table [dbo].[AzureUsageAdditionalInfo]    Script Date: 4/5/2017 11:40:24 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AzureUsageAdditionalInfo](
	[Uid] [uniqueidentifier] NOT NULL,
	[Name] [nvarchar](128) NOT NULL,
	[Value] [nvarchar](256) NOT NULL,
 CONSTRAINT [PK_AzureUsageAdditionalInfo] PRIMARY KEY CLUSTERED 
(
	[Uid] ASC,
	[Name] ASC
)
)

GO
/****** Object:  Table [dbo].[AzureUsageRecords]    Script Date: 4/5/2017 11:40:25 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AzureUsageRecords](
	[Uid] [uniqueidentifier] NOT NULL,
	[Id] [varchar](150) NOT NULL,
	[Name] [varchar](150) NOT NULL,
	[Type] [varchar](150) NOT NULL,
	[SubscriptionId] [uniqueidentifier] NULL,
	[UsageStartTime] [datetime2](0) NOT NULL,
	[UsageEndTime] [datetime2](0) NOT NULL,
	[MeterId] [varchar](50) NOT NULL,
	[MeteredRegion] [varchar](50) NOT NULL,
	[MeteredService] [varchar](100) NOT NULL,
	[Project] [varchar](1000) NOT NULL,
	[MeteredServiceType] [varchar](150) NOT NULL,
	[ServiceInfo1] [varchar](100) NOT NULL,
	[ResourceUri] [varchar](250) NOT NULL,
	[Location] [varchar](100) NOT NULL,
	[Tags] [nvarchar](max) NULL,
	[AdditionalInfo] [nvarchar](max) NULL,
	[PartNumber] [varchar](150) NOT NULL,
	[OrderNumber] [uniqueidentifier] NULL,
	[Quantity] [float] NOT NULL,
	[Unit] [varchar](50) NOT NULL,
	[MeterName] [varchar](150) NOT NULL,
	[MeterCategory] [varchar](150) NOT NULL,
	[MeterSubCategory] [varchar](150) NOT NULL,
	[MeterRegion] [varchar](100) NOT NULL,
	[Cost] [float] NOT NULL,
 CONSTRAINT [PK_dbo.AzureUsageRecords] PRIMARY KEY NONCLUSTERED 
(
	[Uid] ASC
)
)

GO
SET ANSI_PADDING ON

GO
/****** Object:  Index [IX_AzureUsageRecords]    Script Date: 4/5/2017 11:40:25 AM ******/
CREATE CLUSTERED INDEX [IX_AzureUsageRecords] ON [dbo].[AzureUsageRecords]
(
	[UsageStartTime] ASC,
	[SubscriptionId] ASC,
	[MeterCategory] ASC,
	[MeterSubCategory] ASC,
	[MeterName] ASC
)
GO
/****** Object:  Table [dbo].[AzureUsageTags]    Script Date: 4/5/2017 11:40:25 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AzureUsageTags](
	[Uid] [uniqueidentifier] NOT NULL,
	[Name] [nvarchar](256) NOT NULL,
	[Value] [nvarchar](512) NOT NULL,
 CONSTRAINT [PK_AzureUsageTags] PRIMARY KEY CLUSTERED 
(
	[Uid] ASC,
	[Name] ASC
)
)

GO
/****** Object:  Table [dbo].[PerUserTokenCaches]    Script Date: 4/5/2017 11:40:25 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[PerUserTokenCaches](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[WebUserUniqueId] [nvarchar](max) NULL,
	[CacheBits] [varbinary](max) NULL,
	[LastWrite] [datetime2](0) NOT NULL,
 CONSTRAINT [PK_dbo.PerUserTokenCaches] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)
)

GO
/****** Object:  Table [dbo].[ReportRequests]    Script Date: 4/5/2017 11:40:26 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ReportRequests](
	[RepReqId] [uniqueidentifier] NOT NULL,
	[ReportDate] [datetime2](0) NOT NULL,
	[StartDate] [datetime2](0) NOT NULL,
	[EndDate] [datetime2](0) NOT NULL,
	[DetailedReport] [bit] NOT NULL,
	[DailyReport] [bit] NOT NULL,
	[Url] [nvarchar](max) NULL,
 CONSTRAINT [PK_dbo.ReportRequests] PRIMARY KEY CLUSTERED 
(
	[RepReqId] ASC
)
)

GO
/****** Object:  Table [dbo].[Reports]    Script Date: 4/5/2017 11:40:26 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Reports](
	[ReportId] [uniqueidentifier] NOT NULL,
	[SubscriptionId] [uniqueidentifier] NULL,
	[OrganizationId] [uniqueidentifier] NULL,
	[ReportRequest_RepReqId] [uniqueidentifier] NULL,
 CONSTRAINT [PK_dbo.Reports] PRIMARY KEY CLUSTERED 
(
	[ReportId] ASC
)
)

GO
/****** Object:  Table [dbo].[Subscriptions]    Script Date: 4/5/2017 11:40:27 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Subscriptions](
	[Id] [uniqueidentifier] NOT NULL,
	[DisplayName] [nvarchar](max) NULL,
	[OrganizationId] [uniqueidentifier] NULL,
	[IsConnected] [bit] NOT NULL,
	[ConnectedOn] [datetime2](0) NOT NULL,
	[ConnectedBy] [nvarchar](max) NULL,
	[AzureAccessNeedsToBeRepaired] [bit] NOT NULL,
	[DisplayTag] [nvarchar](max) NULL,
	[DataGenStatus] [int] NOT NULL,
	[DataGenDate] [datetime2](0) NOT NULL,
 CONSTRAINT [PK_dbo.Subscriptions] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)
)

GO
SET ANSI_PADDING ON

GO
/****** Object:  Index [IX_AzureUsageRecords_Category]    Script Date: 4/5/2017 11:40:27 AM ******/
CREATE NONCLUSTERED INDEX [IX_AzureUsageRecords_Category] ON [dbo].[AzureUsageRecords]
(
	[MeterCategory] ASC,
	[MeterSubCategory] ASC
)
GO
SET ANSI_PADDING ON

GO
/****** Object:  Index [IX_AzureUsageRecords_Cost]    Script Date: 4/5/2017 11:40:27 AM ******/
CREATE NONCLUSTERED INDEX [IX_AzureUsageRecords_Cost] ON [dbo].[AzureUsageRecords]
(
	[Cost] ASC
)
INCLUDE ( 	[Location],
	[MeterCategory],
	[MeterName],
	[MeterSubCategory],
	[Quantity],
	[ResourceUri],
	[SubscriptionId],
	[UsageStartTime])
GO
/****** Object:  Index [IX_AzureUsageRecords_EndTime]    Script Date: 4/5/2017 11:40:27 AM ******/
CREATE NONCLUSTERED INDEX [IX_AzureUsageRecords_EndTime] ON [dbo].[AzureUsageRecords]
(
	[UsageEndTime] ASC
)
GO
SET ANSI_PADDING ON

GO
/****** Object:  Index [IX_AzureUsageRecords_Location]    Script Date: 4/5/2017 11:40:27 AM ******/
CREATE NONCLUSTERED INDEX [IX_AzureUsageRecords_Location] ON [dbo].[AzureUsageRecords]
(
	[Location] ASC
)
GO
SET ANSI_PADDING ON

GO
/****** Object:  Index [IX_AzureUsageRecords_MeterName]    Script Date: 4/5/2017 11:40:27 AM ******/
CREATE NONCLUSTERED INDEX [IX_AzureUsageRecords_MeterName] ON [dbo].[AzureUsageRecords]
(
	[MeterName] ASC
)
GO
SET ANSI_PADDING ON

GO
/****** Object:  Index [IX_AzureUsageRecords_ResourceUri]    Script Date: 4/5/2017 11:40:27 AM ******/
CREATE NONCLUSTERED INDEX [IX_AzureUsageRecords_ResourceUri] ON [dbo].[AzureUsageRecords]
(
	[ResourceUri] ASC
)
INCLUDE ( 	[SubscriptionId])
GO
/****** Object:  Index [IX_AzureUsageRecords_SubscriptionId]    Script Date: 4/5/2017 11:40:27 AM ******/
CREATE NONCLUSTERED INDEX [IX_AzureUsageRecords_SubscriptionId] ON [dbo].[AzureUsageRecords]
(
	[SubscriptionId] ASC
)
GO
/****** Object:  Index [IX_ReportRequest_repReqID]    Script Date: 4/5/2017 11:40:27 AM ******/
CREATE NONCLUSTERED INDEX [IX_ReportRequest_RepReqId] ON [dbo].[Reports]
(
	[ReportRequest_RepReqId] ASC
)
GO
ALTER TABLE [dbo].[AzureUsageAdditionalInfo]  WITH CHECK ADD  CONSTRAINT [FK_AzureUsageAdditionalInfo_AzureUsageRecords] FOREIGN KEY([Uid])
REFERENCES [dbo].[AzureUsageRecords] ([Uid])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[AzureUsageAdditionalInfo] CHECK CONSTRAINT [FK_AzureUsageAdditionalInfo_AzureUsageRecords]
GO
ALTER TABLE [dbo].[AzureUsageTags]  WITH CHECK ADD  CONSTRAINT [AzureUsageTags_Uid_FK] FOREIGN KEY([Uid])
REFERENCES [dbo].[AzureUsageRecords] ([Uid])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[AzureUsageTags] CHECK CONSTRAINT [AzureUsageTags_Uid_FK]
GO
ALTER TABLE [dbo].[Reports]  WITH CHECK ADD  CONSTRAINT [FK_dbo.Reports_dbo.ReportRequests_ReportRequest_RepReqId] FOREIGN KEY([ReportRequest_RepReqId])
REFERENCES [dbo].[ReportRequests] ([RepReqId])
GO
ALTER TABLE [dbo].[Reports] CHECK CONSTRAINT [FK_dbo.Reports_dbo.ReportRequests_ReportRequest_RepReqId]
GO
ALTER TABLE [dbo].[AzureUsageRecords]  WITH NOCHECK ADD  CONSTRAINT [CK_AzureUsageRecords_AdditionalInfo] CHECK  (([AdditionalInfo] IS NULL))
GO
ALTER TABLE [dbo].[AzureUsageRecords] CHECK CONSTRAINT [CK_AzureUsageRecords_AdditionalInfo]
GO
ALTER TABLE [dbo].[AzureUsageRecords]  WITH NOCHECK ADD  CONSTRAINT [CK_AzureUsageRecords_Tags] CHECK  (([Tags] IS NULL))
GO
ALTER TABLE [dbo].[AzureUsageRecords] CHECK CONSTRAINT [CK_AzureUsageRecords_Tags]
GO
/****** Object:  Trigger [dbo].[AzureUsageRecords_InsertTrigger]    Script Date: 4/5/2017 11:40:27 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE trigger [dbo].[AzureUsageRecords_InsertTrigger]
   on [dbo].[AzureUsageRecords]
   instead of insert
as

set nocount on;

insert into dbo.AzureUsageRecords
	-- insert all columns besides [Tags] and [AdditionalInfo]
	([Uid], Id, [Name], [Type], SubscriptionId, UsageStartTime, UsageEndTime, MeterId, MeteredRegion, MeteredService, Project, MeteredServiceType, ServiceInfo1, ResourceUri, [Location], PartNumber, OrderNumber, Quantity, Unit, MeterName, MeterCategory, MeterSubCategory, MeterRegion, Cost)
select [Uid], Id, [Name], [Type], SubscriptionId, UsageStartTime, UsageEndTime, MeterId, MeteredRegion, MeteredService, Project, MeteredServiceType, ServiceInfo1, ResourceUri, [Location], PartNumber, OrderNumber, Quantity, Unit, MeterName, MeterCategory, MeterSubCategory, MeterRegion, Cost 
from inserted

-- insert Tags
insert into dbo.AzureUsageTags
select i.[Uid], a.[Name], a.[Value]
from inserted i cross apply openjson(Tags) with ([Name] nvarchar(256), [Value] nvarchar(512)) a
where Tags is not null and Tags != ''

-- insert AdditionalInfo
insert into dbo.AzureUsageAdditionalInfo
select i.[Uid], a.[Name], a.[Value]
from inserted i cross apply openjson(AdditionalInfo) with ([Name] nvarchar(128), [Value] nvarchar(256)) a
where AdditionalInfo is not null and AdditionalInfo != ''
GO
ALTER TABLE [dbo].[AzureUsageRecords] ENABLE TRIGGER [AzureUsageRecords_InsertTrigger]
GO

create view dbo.AzureUsageRecordsView
as
select [Uid], Id, [Name], [Type], SubscriptionId, UsageStartTime, UsageEndTime, MeterId, MeteredRegion, MeteredService, Project, MeteredServiceType, ServiceInfo1, ResourceUri, [Location], PartNumber, OrderNumber, Quantity, Unit, MeterName, MeterCategory, MeterSubCategory, MeterRegion, Cost,
ResourceGroup = case when len(ResourceUri) > 68 then substring(ResourceUri, 68, charindex('/', ResourceUri, 68) - 68) else '' end,
ResourceName = case when len(ResourceUri) > 2 then substring(ResourceUri, len(ResourceUri) - charindex('/', reverse(ResourceUri))+2, charindex('/', reverse(ResourceUri))-1) else '' end
from dbo.AzureUsageRecords
GO