Tenho uma estrutura simples em que não tenho certeza de como lidar com alguns dos problemas que surgem.
Existem 4 tabelas: Reports
, ReportParameters
, ScheduledReports
, ScheduledReportParameters
.
ReportParameters
lista os parâmetros necessários para os relatórios.
ScheduledReports
é uma instância agendada de um relatório. (Relatório X a ser executado na quinta-feira como exemplo).
ScheduledReportParameters
é a lista de parâmetros e seus valores a serem usados quando esta instância for executada.
Disposição básica:
Reports:
ReportID (PK)
ReportParameters:
ReportParameterID (PK)
ReportID (FK to Reports)
Name
ScheduledReports:
ScheduledReportID (PK)
ReportID (FK to reports)
ScheduledReportParameters:
ScheduledReportID (FK to ScheduledReports)
ReportParameterID (FK to ReportParameters)
Value
(PK is formed by the ScheduledReportID and ReportParameterID)
Isso tem o problema em que o parâmetro associado a um relatório agendado não precisa concordar com o que o relatório base realmente espera, pode ser um relatório base totalmente diferente e não o relatório no qual o relatório agendado se baseia.
Então, pensei que poderia adicionar o ReportID
ao ao ScheduledReportParameters
, mas isso não ajuda, pois não haveria nada obrigando que o ReportID
lá concordasse com o que o ScheduledReport
é baseado.
Estou perdendo algo simples? Ou isso é mais complicado do que eu pensava?
Ter um relatório agendado com parâmetros que na verdade não acompanham o relatório não é um grande problema para mim, pois quando eu os puxo, as junções filtrarão automaticamente quaisquer possíveis erros, mas eu gostaria de evitar que dados ruins entrem no primeiro lugar. Eu sei que poderia usar gatilhos para fazer isso, mas isso pode ficar feio rapidamente.
Parece que você não está ciente de que a chave estrangeira pode ser baseada em várias colunas.
Então, sim, adicione uma coluna e inclua-
ReportID
aScheduledReportParameters
em duas chaves estrangeiras para impor as restrições.Uma chave estrangeira entre
ScheduledReportParameters
eScheduledReports
usando dois campos(ScheduledReportID, ReportID)
.Segunda chave estrangeira entre
ScheduledReportParameters
eReportParameters
usando dois campos(ReportParameterID, ReportID)
.roteiro completo
Relatórios
Parâmetros do relatório
Relatórios agendados
Parâmetros do Relatório Agendado
É necessário ter índice único em duas colunas que são utilizadas pela chave estrangeira. Adicionei índices explícitos neste exemplo (
IX_ReportParameterID_ReportID
eIX_ScheduledReportID_ReportID
). Você também pode adicionar a segunda coluna à chave primária da tabela correspondente.Dados de amostra
Restrições de teste
Adicione valores de parâmetro para o relatório 1:
Tente adicionar valor para o parâmetro que não pertence ao relatório (o parâmetro 3 pertence ao relatório 2, não 1:
Tente adicionar o valor do parâmetro para o relatório programado errado (enquanto o parâmetro 3 pertence ao relatório 2, o cronograma 1 não é para o relatório 2):
Valores de parâmetros ausentes
Observe que esse esquema não evita valores ausentes para parâmetros. Por exemplo, você pode excluir o valor
V2
:Assim, agora o cronograma
S1
tem valor apenas para o parâmetroP1
e não tem valor para o parâmetroP2
.