Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Neste artigo, aprende a modelar e implementar dependências cross-warehouse usando projetos de bases de dados SQL no Visual Studio Code. Começa-se a partir de dois projetos de armazém existentes e configura-se dependências unidirecionais entre eles usando referências à base de dados e, quando necessário, scripts de pré-implementação e pós-implementação.
Este artigo baseia-se nos conceitos dos projetos de armazém Develop em Visual Studio Code e parte do princípio de que já se sente confortável em construir e publicar um único projeto de armazém.
Pré-requisitos
Antes de começar, certifique-se de que:
- Cria dois Armazéns de Tecidos no mesmo espaço de trabalho.
- Para criar um novo depósito de exemplo, consulte Criar um depósito de exemplo no Microsoft Fabric.
- Crie ou extraia um projeto de base de dados para cada warehouse no Visual Studio Code.
- Para criar um projeto de base de dados para o seu armazém existente ou para um novo armazém, consulte Desenvolver projetos de armazém em Visual Studio Code.
- Instale o Visual Studio Code em sua estação de trabalho.
- Instale o SDK do .NET para criar e publicar projetos de banco de dados.
- Instale duas extensões de código do Visual Studio: Projetos de Banco de Dados SQL e SQL Server (mssql).
- Você pode instalar as extensões necessárias diretamente de dentro do Visual Studio Code marketplace pesquisando por "Projetos de Banco de Dados SQL" ou "SQL Server (mssql)".
- Os projetos de armazém validam, constroem e podem ser publicados em Visual Studio Code.
Observação
Este artigo foca-se em projetos de armazém de dados no Visual Studio Code e em como os versiona no Git como projetos de código normais. A integração do Fabric Git para espaços de trabalho e itens de armazém é abordada separadamente no controlo de versões com o Fabric Data Warehouse e na documentação de integração do Git. O artigo assume que o seu espaço de trabalho Fabric é o destino de implementação e que o esquema T-SQL reside num ou mais projetos Visual Studio Code que controla de versões no Git.
Este artigo não aborda o desenvolvimento cross-warehouse para o endpoint de análise SQL de um Lakehouse. As tabelas do Lakehouse e os objetos de endpoint SQL não são acompanhados no sistema de controlo de versões da mesma forma que os projetos de armazém de dados. Use itens do Warehouse com projetos de bases de dados para uma integração completa com o Git e suporte ao deployment em experiências nativas do Fabric e em ferramentas de cliente.
Cenário: Armazéns interdomínio do Zava Analytics
O Zava Analytics utiliza dois domínios de negócio:
- Vendas – encomendas de clientes, receitas e métricas do pipeline.
- Marketing – campanhas, canais e métricas de envolvimento.
Cada domínio tem:
Um Armazém de Tecidos no mesmo espaço de trabalho:
ZavaSalesWarehouseZavaMarketingWarehouse
Um projeto de base de dados em Visual Studio Code:
Zava.Sales.WarehouseZava.Marketing.Warehouse
Para construir ELT e relatórios de ponta a ponta, cada domínio necessita de vistas apenas de leitura para aceder a dados do outro domínio:
-
SalesPrecisa de envolvimento de marketing por parte do cliente. -
MarketingPrecisa de desempenho de vendas por campanha.
Precisa de:
- Estabelecer dependências unidirecionais entre armazéns via referências de bases de dados.
- Evite dependências cíclicas.
- Use scripts de pré-implantação e pós-implantação para casos em que objetos em ambos os armazéns dependam um do outro.
Garantir que as dependências entre armazéns sejam unidirecionais
Para cada par de armazéns, escolha uma direção para a dependência lógica:
Exemplo:
-
Salesdepende dos dados de engajamento deMarketing. -
Marketingnão dependeSalesde quaisquer objetos que sejam necessários no momento da implantação.
Na prática:
Zava.Sales.Warehouse tem uma referência de base de dados a Zava.Marketing.Warehouse.
- O T-SQL no armazém de
Salespode usar nomes com três componentes, como:SELECT * FROM ZavaMarketingWarehouse.Marketing.CampaignEngagement -
Zava.Marketing.Warehousenão faz referênciaSalesa objetos que forçariam um ciclo de dependência no momento da implementação.
Sugestão
Para cada par de armazéns, desenhe um diagrama simples de setas (Sales → Marketing). Se encontrares setas a apontar em ambas as direções para o mesmo tipo de objeto, provavelmente precisas de reorganizar ou transferir alguma lógica para scripts de pré-implantação e pós-implantação.
Evitar dependências cíclicas
Uma dependência cíclica ocorre quando o Armazém A e o Armazém B dependem um do outro de uma forma que o motor não consegue resolver numa única implementação.
Exemplo de problema (não faças isto):
-
ZavaSalesWarehouse.dbo.CustomerRollupVeja:CREATE VIEW dbo.CustomerRollup AS SELECT c.CustomerId, c.TotalRevenue, m.LastCampaignId FROM dbo.CustomerRevenue AS c LEFT OUTER JOIN ZavaMarketingWarehouse.dbo.CustomerEngagement AS m ON c.CustomerId = m.CustomerId; -
ZavaMarketingWarehouse.dbo.CampaignAttributionVeja:CREATE VIEW dbo.CampaignAttribution AS SELECT m.CampaignId, SUM(s.TotalRevenue) AS RevenueAttributed FROM dbo.Campaigns AS m LEFT OUTER JOIN ZavaSalesWarehouse.dbo.CustomerRollup AS s ON m.CampaignId = s.LastCampaignId GROUP BY m.CampaignId;
Neste anti-padrão:
-
CustomerRollupem Vendas depende deCustomerEngagementem Marketing. -
CampaignAttributionem Marketing depende deCustomerRollupVendas.
Este anti-padrão cria um ciclo: visão de vendas → visão de marketing → visão de vendas novamente.
Orientação:
Não modele dependências mútuas entre armazéns como objetos regulares ao nível do esquema. Se realmente precisas deste tipo de lógica, move um lado da dependência para:
- Um script pós-implantação, ou
- Um modelo semântico a jusante ou relatório que une os dois armazéns no momento da consulta.
Use scripts de pré e pós-implantação para lógica crucial ao processo de implementação entre armazéns.
Como as implementações em armazém são operações completas de diferença de esquema (não implementações parciais por objeto), trate cuidadosamente os itens entre armazém:
Se o Armazém A e o Armazém B precisam ambos de objetos que dependem um do outro:
- Mantém as tabelas centrais e as vistas principais em cada projeto de armazém.
- Mover vistas de ponte ou objetos utilitários que criam ciclos em scripts de pré ou pós-implementação num projeto.
- Certifica-te de que esses scripts são idempotentes e seguros para reexecutar.
Exemplos de padrões:
- Script pré-implantação: eliminar temporariamente uma vista entre armazéns antes de aplicar alterações no esquema que a possam incompatibilizar.
- Script pós-implementação: recriar ou atualizar a vista inter-armazéns após a implementação de ambos os armazéns.
Padrão 1: Referências diretas entre armazéns via referências de base de dados
Neste padrão, modelas dependências unidirecionais diretamente nos projetos de base de dados usando Referências de Base de Dados.
Passo 1: Começar a partir de dois projetos de armazém existentes
Já devias ter:
-
Zava.Sales.Warehouse→ implantado emZavaSalesWarehouse -
Zava.Marketing.Warehouse→ implementado emZavaMarketingWarehouse
Cada projeto foi criado ou extraído usando os passos descritos em Desenvolver projetos de armazém no Visual Studio Code.
Passo 2: Adicionar uma referência da base de dados de Vendas para a de Marketing
- No Visual Studio Code, abra a exibição Projetos de Base de Dados.
- Clique com o botão direito do rato no
Zava.Sales.Warehouseprojeto. - Selecionar Adicionar Referência de Base de Dados....
- Escolha um dos:
- Projeto de base de dados no espaço de trabalho atual (Um projeto de base de dados referenciado desta forma também deve estar aberto no Visual Studio Code), ou
-
Aplicação no nível de dados (.dacpac) (Assume que já concluiu uma compilação
.dacpacpara o armazémMarketing).
- Defina as opções de referência:
- Tipo de referência: Mesmo servidor, base de dados diferente.
-
Nome ou variável da base de dados: Use uma variável SQLCMD, por exemplo
[$(MarketingWarehouseName)].
- Salve e reconstrua o projeto de Vendas.
No .sqlproj ficheiro, deverá ver uma entrada semelhante a:
<ItemGroup>
<ArtifactReference Include="..\Zava.Marketing.Warehouse\bin\Debug\Zava.Marketing.Warehouse.dacpac">
<DatabaseVariableLiteralValue>$(MarketingWarehouseName)</DatabaseVariableLiteralValue>
</ArtifactReference>
</ItemGroup>
<ItemGroup>
<SqlCmdVariable Include="MarketingWarehouseName">
<DefaultValue>ZavaMarketingWarehouse</DefaultValue>
</SqlCmdVariable>
</ItemGroup>
Sugestão
Usar uma variável SQLCMD para o nome do armazém remoto permite-te reutilizar o mesmo projeto em todos os teus ambientes, como Dev/Test/Prod, onde os nomes dos armazéns podem ser diferentes.
Passo 3: Criar uma vista inter-armazéns no sistema de Vendas
No projeto Sales, adicione uma visualização que leia do armazém Marketing.
-- schema/Views/dbo.CustomerEngagementFact.sql
CREATE VIEW [dbo].[CustomerEngagementFact] AS
SELECT
s.CustomerId,
s.TotalRevenue,
m.LatestChannel,
m.LastEngagementDate
FROM dbo.CustomerRevenue AS s
JOIN [$(MarketingWarehouseName)].[dbo].[CustomerEngagement] AS m
ON s.CustomerId = m.CustomerId;
Pontos principais:
- O nome
[$(MarketingWarehouseName)].[dbo].[CustomerEngagement]em três partes corresponde ao padrão T-SQL usado para consultas cross-warehouse no editor Fabric SQL. - O DacFx resolve a base de dados externa através da referência da base de dados.
Construa o projeto para garantir que não há SQL71501 erros de referência não resolvidos .
Passo 4: Publique o armazém de Marketing e depois as Vendas
Para evitar problemas de implantação:
-
Construir e publicar
Zava.Marketing.WarehousePrimeiro:- Clique com o botão direito no projeto → Build.
- Clique com o botão direito do projeto → Publicar → escolher
ZavaMarketingWarehouse.
- Quando
Marketinga implementação for bem-sucedida, compilar e publicarZava.Sales.Warehouse:- Clique com o botão direito no projeto → Build.
- Clique com o botão direito do projeto → Publicar → escolher
ZavaSalesWarehouse.
O fluxo de implementação resultante é:
Zava.Marketing.Warehouse (sem dependências externas) → Zava.Sales.Warehouse (depende de Marketing)
Agora, qualquer consulta T-SQL em ZavaSalesWarehouse pode usar a dbo.CustomerEngagementFact view, que lê do Marketing warehouse internamente usando T-SQL entre armazéns.
Padrão 2: Dependências inter-armazém geridas através de scripts pré e pós-desdobramento
Em alguns cenários de Zava Analytics, ambos os domínios podem precisar de objetos agregados que dependem um do outro. Por exemplo:
- A equipa de vendas quer uma perspetiva que utilize dados de campanhas de marketing para fornecer a receita de vendas por campanha.
- O marketing quer uma perspetiva que utilize dados de receitas de vendas para garantir eficiência nas campanhas de marketing.
Não quer que ambos os objetos sejam visões regulares que participam na implementação completa do modelo, pois isso pode causar uma dependência cíclica ou uma ordem de implementação frágil.
Em vez disso, você:
- Mantenha o modelo central de cada armazém independente.
- Use scripts pós-implementação num projeto para criar mais vistas inter-armazém após a implementação de ambos os esquemas.
Passo 1: Adicionar referências à base de dados para validação em tempo de compilação
Configure referências semelhantes ao Padrão 1, mas para ambos os projetos:
- Em
Zava.Sales.Warehouse, adicione uma referência ao Marketing via[$(MarketingWarehouseName)]. - Em
Zava.Marketing.Warehouse, opcionalmente adicione uma referência a Sales através de[$(SalesWarehouseName)]se quiser validação em tempo de compilação das vistas entre armazéns usadas em scripts.
Nos ficheiros .sqlproj, poderá definir:
<SqlCmdVariable Include="SalesWarehouseName">
<DefaultValue>ZavaSalesWarehouse</DefaultValue>
</SqlCmdVariable>
Passo 2: Criar objetos centrais como objetos de projeto normais
Exemplo:
Salesprojeto:- Tabela
dbo.CustomerRevenue -
dbo.SalesByCampaignvista (usando apenas tabelas locais)
- Tabela
Marketingprojeto:- Tabela
dbo.Campaigns -
dbo.CampaignStatsvista (usando apenas tabelas locais)
- Tabela
Estes objetos não utilizam consultas entre-armazéns. No próximo passo, vamos introduzir referências entre armazéns.
Passo 3: Adicionar um script para pós-implementação de vistas de interligação entre armazéns
Escolher um armazém para alojar objetos bridge; tipicamente o domínio que consome mais a saída combinada. Suponha Sales que é esse domínio.
- No
Salesprojeto: Clique com o botão direito no projeto, depois Adicionar → Script Pós-Implementação. - Nomeia o script
PostDeployment_CrossWarehouse.sql. - No script, cria ou altera as vistas cross-warehouse usando
IF EXISTS/DROP/CREATEpadrões para as manter idempotentes.
Exemplo de um script em Sales que vai referenciar Marketing objetos de armazém:
-- PostDeployment_CrossWarehouse.sql
-- Ensure object can be recreated safely
IF OBJECT_ID('dbo.CampaignRevenueBridge', 'V') IS NOT NULL
DROP VIEW [dbo].[CampaignRevenueBridge];
GO
CREATE VIEW [dbo].[CampaignRevenueBridge] AS
SELECT
c.CampaignId,
c.CampaignName,
m.Channel,
SUM(s.TotalRevenue) AS Revenue
FROM [$(MarketingWarehouseName)].[dbo].[Campaigns] AS c
JOIN [$(MarketingWarehouseName)].[dbo].[CampaignEngagement] AS m
ON c.CampaignId = m.CampaignId
JOIN dbo.SalesByCampaign AS s
ON s.CampaignId = c.CampaignId
GROUP BY
c.CampaignId,
c.CampaignName,
m.Channel;
GO
Aqui:
- Os projetos principais
SaleseMarketingde armazém mantêm-se independentes e implementáveis por si só. - A vista da ponte é criada após a implementação do esquema por meio do script pós-implantação.
- Se a implementação for executada várias vezes, é idempotente, pois o script remove e recria a vista com segurança.
Passo 4: (Opcional) Use scripts de pré-implementação para proteger dependências frágeis
Em cenários mais avançados, poderia:
- Use um script pré-implementação para eliminar ou desativar vistas cross-warehouse que possam bloquear alterações de esquema (por exemplo, se estiver a renomear colunas).
- Permita que o DacFx aplique a diferença de esquema.
- Use o script pós-implementação para recriar ou atualizar as vistas inter-armazém.
Importante
Os scripts pré e pós-implementação são executados como parte do plano de implementação e devem ser:
- Idempotentes, o que significa que são seguras para usar várias vezes.
- Compatível com o esquema final produzido pelo DacFx.
- Livre de alterações destrutivas que entrem em conflito com a sua
BlockOnPossibleDataLosspolítica.
Passo 5: Publicação do pedido para dependências geridas por scripts
Um padrão comum para o Zava Analytics:
- Publicar projetos base:
-
Zava.Marketing.Warehouse(esquema principal) -
Zava.Sales.Warehouse(esquema central + script pós-implementação entre armazéns)
-
- Deixe o script pós-implementação de Sales criar as vistas da ponte depois que o seu próprio esquema e o
Marketingesquema referenciado forem implementados.
Caso introduza mais de dois armazéns, repita este padrão em camadas. Nunca crie dependências cíclicas através de objetos de projeto comuns.
Continue a aprender
- Combina estes padrões com controlo de versões e orientação CI/CD nos documentos sobre o controlo de versões com o Data Warehouse do Fabric e documentação de integração git.
- Estenda o cenário do Zava Analytics para incluir ambientes Dev/Test/Prod, usando pipelines de implementação ou CI/CD externo para coordenar a ordem de publicação em vários armazéns.