ФОН:
Я должен предварить это, сказав, что не пытаюсь заставить кого-то сделать мою работу за меня. Я чувствую, что нахожусь на каком-то перекрестке, где есть несколько способов достичь своей цели, но я не уверен, какие из них являются «стандартными» и / или не хватает моих относительно ограниченных знаний.
У меня есть система, которая развивается уже шесть месяцев, и с 11 января схема БД довольно стабильна. ( Я никогда не был уверен, совершил ли я большую ошибку, создавая базу данных для каждого месяца, чтобы соответствовать ежемесячным учетным циклам, но у меня просто не было ноу-хау, чтобы поступить иначе )
ТЕПЕРЬ:
Мой начальник просит меня составлять отчеты за год, состоящие из записей из всех ежемесячных баз данных.
ЧТО Я НАЧАЛ, ДЕЛАЯ:
Я собрал схему метаданных и наполнил ее достаточным количеством информации, чтобы написать приложение для выполнения операций ETL.
Вот как это выглядит:
USE [DAMain1]
GO
CREATE TABLE AccountingPeriod (
Id INT PRIMARY KEY NOT NULL,
Name VARCHAR(255) NOT NULL UNIQUE,
DateStart DATE NOT NULL,
DateStop DATE NOT NULL
)
GO
INSERT INTO AccountingPeriod VALUES
(1, 'Jan11', '1/1/2011', '1/31/2011')
,(2, 'Feb11', '2/1/2011', '2/28/2011')
,(3, 'Mar11', '3/1/2011', '3/31/2011')
,(4, 'Apr11', '4/1/2011', '4/30/2011')
,(5, 'May11', '5/1/2011', '5/31/2011')
CREATE TABLE [DBServer] (
Id INT PRIMARY KEY NOT NULL,
Name VARCHAR(255) NOT NULL UNIQUE
)
GO
INSERT INTO DBServer VALUES
(1, 'Aaron.directagents.local')
GO
CREATE TABLE [DBInstance] (
Id INT PRIMARY KEY NOT NULL
,DBServerId int NOT NULL REFERENCES DBServer(Id)
,SchemaName VARCHAR(255) NOT NULL
,CatalogName VARCHAR(255) NOT NULL
,ConnectionString VARCHAR(2000) NOT NULL
)
GO
INSERT INTO DBInstance VALUES
(1, 1, 'dbo', 'DADatabaseR2', 'Data Source=aaron\sqlexpress;Initial Catalog=DADatabaseR2;Integrated Security=True')
,(2, 1, 'dbo', 'DADatabaseR3', 'Data Source=aaron\sqlexpress;Initial Catalog=DADatabaseR3;Integrated Security=True')
,(3, 1, 'dbo', 'DADatabaseMarch11', 'Data Source=aaron\sqlexpress;Initial Catalog=DADatabaseMarch11;Integrated Security=True')
,(4, 1, 'dbo', 'DADatabaseApr11', 'Data Source=aaron\sqlexpress;Initial Catalog=DADatabaseApr11;Integrated Security=True')
GO
CREATE TABLE DADB (
Id int PRIMARY KEY NOT NULL,
Name VARCHAR(255) NOT NULL UNIQUE,
AccountingPeriodId int NOT NULL REFERENCES AccountingPeriod(Id),
DBInstanceId INT NOT NULL REFERENCES DbInstance(Id)
)
GO
INSERT INTO DADB VALUES
(1, 'Direct Agents Database for January 2011', 1, 1)
,(2, 'Direct Agents Database for February 2011', 2, 2)
,(3, 'Direct Agents Database for March 2011', 3, 3)
,(4, 'Direct Agents Database for April 2011', 4, 4)
GO
CREATE VIEW DADBs AS
SELECT
DA.Name [Database]
,AP.Name [Accounting Period]
,AP.DateStart [Start]
,AP.DateStop [Stop]
,DS.Name [Server]
,DI.SchemaName
,DI.CatalogName
,DI.ConnectionString [Connection]
FROM
DADB DA
INNER JOIN AccountingPeriod AP ON DA.AccountingPeriodId=AP.Id
INNER JOIN DBInstance DI ON DA.DBInstanceId=DI.Id
INNER JOIN DBServer DS ON DI.DBServerId=DS.Id
GO
SELECT * FROM DADBs
GO
ПРОБЛЕМА:
Я не знаю, является ли это разумным / нормальным способом сделать это. У меня есть достаточно времени, чтобы разобраться с чем-то одним, но я не могу понять, по какому пути идти.
ВОПРОС: Учитывая, что мне нужно извлекать данные о позициях и агрегировать их по нескольким базам данных, как я объяснил, есть ли альтернативы определению таблиц метаданных, которые определяют пользовательские решения ETL? (для моих целей приложение C # и проект служб SSIS являются eqiv, но мне интересно знать, можно ли здесь использовать службы Analysis Services или Reporting Services)