Azure 数据流创建/管理身份关系 key

标签 azure azure-devops azure-sql-database azure-data-factory

很想知道通过 ADF 生成关系身份的最佳方法是什么。

现在,我正在使用没有任何身份信息的 JSON 数据。然后,该数据被转换为具有关系(1..n 等)的多个数据库接收器表。由于某些目标接收器表上的 FK 约束,这些关系需要一次“建立”一个。

这种方法似乎有点笨拙,所以我想看看是否还有其他我不知道的选项。

请注意,我需要为每个插入包含代理键生成。如果我不这样做,根据输出数据库架构,我将收到“无法插入 PK null”错误。

另请注意,我为每个接收器打开/关闭IDENTITY_INSERT

enter image description here

最佳答案

我倾向于更多地采用 ELT 方法并使用 Azure SQL DB 中的 native JSON 功能,即 OPENJSON。您可以使用 ADF(例如存储过程事件)将 JSON 放入 Azure SQL DB 的表中,然后调用另一个存储过程来处理 JSON,如下所示:

-- Setup
DROP TABLE IF EXISTS #tmp
DROP TABLE IF EXISTS import.City;
DROP TABLE IF EXISTS import.Region;
DROP TABLE IF EXISTS import.Country;
GO

DROP SCHEMA IF EXISTS import 
GO

CREATE SCHEMA import
    CREATE TABLE Country ( CountryKey INT IDENTITY PRIMARY KEY, CountryName VARCHAR(50) NOT NULL UNIQUE )
    CREATE TABLE Region ( RegionKey INT IDENTITY PRIMARY KEY, CountryKey INT NOT NULL FOREIGN KEY REFERENCES import.Country, RegionName VARCHAR(50) NOT NULL UNIQUE )
    CREATE TABLE City ( CityKey INT IDENTITY(100,1) PRIMARY KEY, RegionKey INT NOT NULL FOREIGN KEY REFERENCES import.Region, CityName VARCHAR(50) NOT NULL UNIQUE )
GO


DECLARE @json NVARCHAR(MAX) = '{
   "Cities": [
      {
         "Country": "England",
         "Region": "Greater London",
         "City": "London"
      },
      {
         "Country": "England",
         "Region": "West Midlands",
         "City": "Birmingham"
      },
      {
         "Country": "England",
         "Region": "Greater Manchester",
         "City": "Manchester"
      },
      {
         "Country": "Scotland",
         "Region": "Lothian",
         "City": "Edinburgh"
      }
   ]
}'


SELECT *
INTO #tmp
FROM OPENJSON( @json, '$.Cities' )
WITH
(
    Country     VARCHAR(50),
    Region      VARCHAR(50),
    City        VARCHAR(50)
)
GO


-- Add the Country first (has no foreign keys)
INSERT INTO import.Country ( CountryName )
SELECT DISTINCT Country
FROM #tmp s
WHERE NOT EXISTS ( SELECT * FROM import.Country t WHERE s.Country = t.CountryName )


-- Add the Region next including Country FK
INSERT INTO import.Region ( CountryKey, RegionName )
SELECT t.CountryKey, s.Region
FROM #tmp s
    INNER JOIN import.Country t ON s.Country = t.CountryName


-- Now add the City with FKs
INSERT INTO import.City ( RegionKey, CityName )
SELECT r.RegionKey, s.City
FROM #tmp s
    INNER JOIN import.Country c ON s.Country = c.CountryName
    INNER JOIN import.Region r ON s.Region = r.RegionName
        AND c.CountryKey = r.CountryKey


SELECT * FROM import.City;
SELECT * FROM import.Region;
SELECT * FROM import.Country;

这是一个简单的测试脚本,旨在展示这个想法,应该端到端运行,但它不是生产代码。

关于Azure 数据流创建/管理身份关系 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62457704/

相关文章:

sql-server - 使用 Azure Resource Mover 和 SQL Server 是否存在丢失数据的风险?

SQL Azure - 与本地主机数据库相比非常慢

Azure powershell 任务 : Azure DevOps 中的 AzureRM 命令

azure - 如何通过 URL 从 Azure Databricks 中的 DBFS 下载

azure - .NET Core 项目的 Azure Pipelines 中不必要的启动命令

tfs - Visual Studio 团队服务导入历史记录

azure - 在 Azure CDN 中设置响应 header (安全性)

c# - 在 Twilio 的 WebAPI OWIN 上返回 XML 内容

azure - ADF CI 构建错误 : Command failed: node/home/shaadmin/myagent/_work/5/s/adf/build/downloads/main. js 验证

sql-server - 尽管连接数远低于资源限制,但已达到 Azure Sql 请求限制