【问题标题】:Azure Data Flow creating / managing keys for identity relationshipsAzure 数据流创建/管理身份关系的密钥
【发布时间】:2020-06-18 19:13:13
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我倾向于采用更多 ELT 方法并使用 Azure SQL DB 中的原生 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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 2020-07-07
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多