共用方式為


一般 SQL 連接器技術參考

本文說明一般 SQL 連接器。 本文適用於下列產品:

針對MIM2016,連接器可從Microsoft下載中心下載

若要查看此連接器運作情形,請參閱 一般 SQL 連接器逐步 文章。

注意

Microsoft Entra ID 現在提供輕量型代理程式型解決方案,以將使用者布建到 SQL 資料庫,而不需要 MIM 同步部署。 建議將其用於輸出使用者布建。 深入了解

一般 SQL 連接器概觀

一般 SQL 連接器可讓您整合同步處理服務與提供 ODBC 連線的資料庫系統。

從高階的觀點來看,連接器的目前版本支援下列功能:

功能 支援
線上的數據源 連接器支援所有 64 位 ODBC 驅動程式*。 它已經過下列測試:
  • Microsoft SQL Server 和 SQL Azure
  • IBM DB2 11.5.8
  • Oracle 11g
  • Oracle 12c 和 18c
  • Oracle 21c 和 23c
  • MySQL 5.x
  • MySQL 8.x
  • Postgres
  • 案例
  • 物件生命週期管理
  • 密碼管理
  • Operations
  • 完整匯入和差異匯入、匯出
  • 針對匯出:新增、刪除、更新和取代
  • 設定密碼,變更密碼
  • 結構描述
  • 動態探索物件和屬性
  • 必要條件

    使用連接器之前,請確定您在同步處理伺服器上具有下列專案:

    • Microsoft .NET 4.6.2 Framework 或更新版本
    • 64 位 ODBC 用戶端驅動程式
    • 如果您使用連接器與 Oracle 12c 通訊,這需要 Oracle Instant Client 12.2.0.1 或更新的 ODBC 套件。
    • 如果您使用連接器與 Oracle 18c-23c 通訊,這需要 Oracle Instant Client 18-23 或更新版本與 ODBC 套件通訊,而且NLS_LANG系統變數必須設定為支援 UTF8 字元,例如 NLS_LANG=AMERICAN_AMERICA。AL32UTF8。
    • 此連接器會使用每個交易的 SQL 備妥語句和多個語句。 某些 RDBM 系統在 ODBC 驅動程式中可能有與交易處理、伺服器端備妥 SQL 語句和相同交易內多個語句相關的問題。 請據以設定 DSN 連線選項,以確保這些語句正確地傳送至您的資料庫。例如,MySQL ODBC Driver 8.0.32 版需要選項NO_SSPS=1,MULTI_STATEMENTS=1。 其他選項,例如「自動認可」或「僅限成功作業認可」,可能會影響批次導出的處理方式;如需詳細資訊,請參閱您的資料庫管理員。 若要針對匯出期間的問題進行疑難解答,請將匯出批次大小設定為1,並啟用連接器詳細信息記錄。

    部署此連接器可能需要變更資料庫的組態,以及 MIM 的組態變更。 針對在生產環境中整合 MIM 與第三方資料庫伺服器的部署,我們建議客戶與其資料庫廠商合作,或部署夥伴以取得此整合的說明、指引和支援。

    線上數據源中的許可權

    若要在一般 SQL 連接器中建立或執行任何支援的工作,您必須具備:

    • db_datareader
    • db_datawriter

    連接埠和通訊協定

    如需 ODBC 驅動程式運作所需的埠,請參閱資料庫廠商的檔。

    建立新的連接器

    若要建立一般 SQL 連接器,請在 [同步處理服務] 中選取 [管理代理程式和建立]。 選取 [ 一般 SQL][Microsoft] 連接器。

    CreateConnector 第 1 頁

    連線性

    連接器會使用 ODBC DSN 檔案進行連線。 使用 [系統管理工具] 下的 [開始] 功能表中找到的 ODBC 數據源建立 DSN 檔案。 在系統管理工具中,建立 檔案 DSN ,以便提供給連接器。

    CreateConnector 第 2 頁

    當您建立新的一般 SQL 連接器時,[連線能力] 畫面是第一個。 您必須先提供下列資訊:

    • DSN 檔案路徑
    • 驗證
      • 使用者名稱
      • 密碼

    資料庫應該支援下列其中一個驗證方法:

    • Windows 驗證:驗證資料庫會使用 Windows 認證來驗證使用者。 指定的使用者名稱/密碼是用來向資料庫進行驗證。 此帳戶需要資料庫的許可權。
    • SQL 驗證:驗證資料庫會使用使用者名稱/密碼定義一個連線畫面來連線到資料庫。 如果您將使用者名稱/pasword 儲存在 DSN 檔案中,連線畫面上提供的認證具有優先順序。
    • Azure SQL 資料庫 驗證:如需詳細資訊,請參閱透過 Microsoft Entra 驗證連線到 SQL 資料庫。

    DN 是錨點:如果您選取此選項,DN 也會當做錨點屬性使用。 它可用於簡單的實作,但也具有下列限制:

    • 連接器僅支援一個物件類型。 因此,任何參考屬性只能參考相同的物件類型。

    匯出類型:物件取代:匯出期間,當只有某些屬性已變更時,會匯出具有所有屬性的整個物件,並取代現有的物件。

    架構 1 (偵測物件類型)

    在此頁面上,您將設定連接器在資料庫中尋找不同物件類型的方式。

    每個物件類型都會以分割區的形式呈現,並在設定數據分割和階層進一步設定。

    schema1a 映射

    物件類型偵測方法:連接器支援這些物件類型偵測方法。

    • 固定值:您可以使用逗號分隔清單來提供物件類型清單。 例如: User,Group,Department
      schema1b 映像
    • 數據表/檢視/預存程式:提供數據表/檢視/預存程式的名稱,然後提供物件類型清單的數據行名稱。 如果您使用預存程式,則也會以 [Name]:[Direction]:[Value] 格式提供其參數。 在不同的行上提供每個參數(使用 Ctrl+Enter 取得新行)。
      schema1c 映像
    • SQL 查詢:此選項可讓您提供 SQL 查詢,以傳回具有物件類型的單一資料行,例如 SELECT [Column Name] FROM TABLENAME。 傳回的數據行必須是 string (varchar) 類型。

    架構 2 (偵測屬性類型)

    在此頁面上,您將設定如何偵測屬性名稱和類型。 針對上一頁偵測到的每個物件類型,都會列出組態選項。

    schema2a 映像

    屬性類型偵測方法:連接器支援這些屬性類型偵測方法,且架構 1 畫面中每個偵測到的物件類型。

    • 數據表/檢視/預存程式:提供應該用來尋找屬性名稱的數據表/檢視/預存程序名稱。 如果您使用預存程式,則也會以 [Name]:[Direction]:[Value] 格式提供其參數。 在不同的行上提供每個參數(使用 Ctrl+Enter 取得新行)。 若要偵測多重值屬性中的屬性名稱,請提供以逗號分隔的數據表或檢視清單。 父數據表和子數據表具有相同數據行名稱時,不支援多重值案例。
    • SQL 查詢:此選項可讓您提供 SQL 查詢,以傳回具有屬性名稱的單一資料行,例如 SELECT [Column Name] FROM TABLENAME。 傳回的數據行必須是 string (varchar) 類型。

    架構 3 (定義錨點和 DN)

    此頁面可讓您為每個偵測到的物件類型設定錨點和 DN 屬性。 您可以選取多個屬性,讓錨點成為唯一的。

    schema3a 映射

    • 未列出多重值和布爾屬性。

    • 除非已選取 [連線能力] 頁面上的 [錨點] ,否則 相同的屬性無法用於 DN 和錨點

    • 如果在 [連線能力] 頁面上選取 [DN] 為 [錨點 ],則此頁面只需要 DN 屬性。 這個屬性也會當做錨點屬性使用。

      schema3b 映像

    架構 4 (定義屬性類型、參考和方向)

    此頁面可讓您設定屬性類型,例如整數、二進位或布爾值,以及每個屬性的方向。 頁面 架構 2 中的所有屬性都會列出,包括多重值屬性。

    schema4a 映射

    • DataType:用來將屬性類型對應至同步處理引擎已知的類型。 默認值是使用與 SQL 架構中所偵測到的相同類型,但無法輕易偵測 DateTime 和 Reference。 針對這些,您必須指定 DateTimeReference
    • 方向:您可以將屬性方向設定為 Import、Export 或 ImportExport。 ImportExport 是預設值。

    schema4b 映像

    注意:

    • 如果連接器無法偵測屬性類型,則會使用 String 數據類型。
    • 巢狀數據表 可以視為一個數據行資料庫數據表。 Oracle 不會以任何特定順序儲存巢狀數據表的數據列。 不過,當您將巢狀數據表擷取到 PL/SQL 變數時,數據列會指定從 1 開始的連續下標。 這可讓您對個別數據列進行類似數位的存取。
    • 連接器不支援 VARRYS

    架構 5 (定義參考屬性的資料分割 )

    在此頁面上,您會針對分割區 (物件類型) 屬性所參考的所有參考屬性進行設定。

    schema5 映像

    如果您使用 DN 是錨點,則必須使用與您參考的物件類型相同的物件類型。 您無法參考另一個物件類型。

    注意

    從 2017 年 3 月更新開始,現在有一個選項可供 “*” 選擇此選項時,將會匯入所有可能的成員類型。

    globalparameters3 影像

    重要

    自 2017 年 5 月起,“*” 已 變更任何選項 以支援匯入和匯出流程。 如果您想要使用此選項,多重值數據表/檢視應該有包含物件類型的屬性。

    在映像之前多重值任何選項


    如果已選取 「*」,則也必須指定具有物件類型的數據行名稱。
    多重值映像之後的任何選項

    匯入之後,您會看到類似下圖的內容:

    globalparameters31 影像

    全域參數

    [全域參數] 頁面可用來設定 Delta Import、Date/Time 格式和 Password 方法。

    globalparameters1 影像

    泛型 SQL 連接器支援下列差異匯入方法:

    • 觸發程式:請參閱使用觸發程式產生差異檢視
    • 浮浮浮水印:可與任何資料庫搭配使用的泛型方法。 浮浮水印查詢會根據資料庫廠商預先填入。 每個使用的數據表/檢視都必須有水位線數據行。 此數據行必須追蹤數據表的插入和更新,以及其相依的數據表(多重值或子數據表)。 同步處理服務與資料庫伺服器之間的時鐘必須同步處理。 如果沒有,可能會省略差異匯入中的某些專案。
      限度:
      • 浮浮水印策略不支援已刪除的物件。
    • 快照集:(僅適用於Microsoft SQL Server) 使用快照集產生差異檢視
    • 變更追蹤: (僅適用於 Microsoft SQL Server) 關於 變更追蹤
      局限性:
      • 錨點和 DN 屬性必須是數據表中所選物件之主鍵的一部分。
      • 使用 變更追蹤 匯入和匯出期間不支援 SQL 查詢。

    其他參數:指定指出資料庫伺服器所在位置的資料庫伺服器時區。 這個值可用來支援日期和時間屬性的各種格式。

    連接器一律會以UTC格式儲存日期和時間。 若要能夠正確轉換日期和時間,必須指定資料庫伺服器的時區和所使用的格式。 格式應該以 .NET 格式表示。

    在匯出期間,每個日期時間屬性都必須以UTC時間格式提供給連接器。

    globalparameters2 影像

    密碼組態:連接器提供密碼同步處理功能,並支援設定和變更密碼。

    連接器提供兩種方法來支援密碼同步處理:

    • 預存程式:此方法需要兩個預存程式來支援 Set 和 Change password。 根據下列範例,分別在 [設定密碼 SP] 和 [變更密碼 SP 參數] 中輸入新增和變更密碼作業的所有參數。 globalparameters32 影像
    • 密碼延伸模組:此方法需要密碼擴充 DLL(您需要提供實作 IMAExtensible2Password 介面的延伸模組 DLL 名稱)。 密碼延伸模組元件必須放在延伸模組資料夾中,以便連接器可以在運行時間載入 DLL。 globalparameters4 影像

    您也必須在 [設定擴充功能] 頁面上啟用密碼管理globalparameters5 影像

    設定分割和階層

    在 [數據分割和階層] 頁面上,選取所有物件類型。 每個物件類型都是它自己的分割區。

    partitions1 映像

    您也可以覆寫 [連線能力] 或 [全域參數] 頁面上定義的值。

    partitions2 映像

    設定錨點

    此頁面是只讀的,因為錨點已經定義。 選取的錨點屬性一律會附加物件類型,以確保它在物件類型之間保持唯一。

    錨點影像

    設定執行步驟參數

    這些步驟是在連接器上的執行配置檔上設定。 這些設定會執行匯入和匯出數據的實際工作。

    完整和差異匯入

    一般 SQL 連接器支援使用下列方法進行完整和差異匯入:

    • Table
    • 檢視
    • 預存程序
    • SQL 查詢

    runstep1 映像

    數據表/檢視
    若要匯入物件的多重值屬性,您必須在 [多重值數據表/檢視表名稱] 中提供數據表/檢視名稱,以及父數據表之 Join 條件中的個別聯結條件。 如果數據源中有多個多重值數據表,您可以使用聯集到單一檢視。

    重要

    一般 SQL 管理代理程式只能使用一個多重值數據表。 請勿放入多重值數據表/檢視的 [名稱] 中,多個數據表的名稱。 這是泛型 SQL 的限制。

    範例:您想要匯入 Employee 物件及其所有多重值屬性。 有兩個數據表,名為 Employee (main table) 和 Department (多重值)。 執行下列操作:

    • 在數據表/檢視/SP輸入 Employee
    • 在多重值數據表/檢視表的名稱中輸入 Department。
    • 在 [加入條件] 中輸入 Employee & Department 之間的聯結條件,例如 Employee.DEPTID=Department.DepartmentID runstep2 映像

    預存程序
    runstep3 映像

    • 如果您有大量數據,建議您使用預存程序實作分頁。
    • 若要讓預存程式支援分頁,您必須提供起始索引和結束索引。 請參閱: 有效率地分頁大量數據
    • @StartIndex和 @EndIndex 會在運行時間取代為在 [設定步驟] 頁面上設定的個別頁面大小值。 例如,當連接器擷取第一頁且頁面大小設定為 500 時,在這種情況下 @StartIndex 會是 1 和 @EndIndex 500。 當連接器擷取後續頁面並變更 @StartIndex 和 @EndIndex 值時,這些值就會增加。
    • 若要執行參數化預存程式,請以格式提供參數 [Name]:[Direction]:[Value] 。 在個別行輸入每個參數(使用 Ctrl + Enter 取得新行)。
    • 一般 SQL 連接器也支援從 Microsoft SQL Server 中的連結伺服器匯入作業。 如果應該從連結伺服器中的數據表擷取資訊,則應以下列格式提供 Table: [ServerName].[Database].[Schema].[TableName]
    • 一般 SQL 連接器只支援在執行步驟資訊和架構偵測之間具有類似結構的物件(別名名稱和數據類型)。 如果從架構選取的對象和執行步驟中提供的資訊不同,則 SQL Connector 無法支援這種類型的案例。

    SQL 查詢
    runstep4 映像

    runstep5 映像

    重要

    CRLF 或新的行字元可作為多個語句之間的分隔符。

    使用分頁的 SQL 查詢範例 - 不正確的查詢,將無法使用新的行字元

    WITH A AS 
      (select dense_rank() over (order by BusinessEntityID) 
        rownumber, BusinessEntityID, DeptID, NationalIDNumber, LoginID, JobTitle, BirthDate, MaritalStatus, HireDate, ModifiedDate, Password 
        from Employees
      ) select * from A where rownumber between @StartIndex and @EndIndex
    

    使用分頁的 SQL 查詢範例 - 正確的查詢

    WITH A AS (select dense_rank() over (order by BusinessEntityID) rownumber, BusinessEntityID, DeptID, NationalIDNumber, LoginID, JobTitle, BirthDate, MaritalStatus, HireDate, ModifiedDate, Password from Employees) select * from A where rownumber between @StartIndex and @EndIndex
    
    • 不支援多個結果集查詢。
    • SQL 查詢支援分頁,並提供起始索引和結束索引做為變數,以支援分頁。

    差異匯入

    runstep6 映像

    相較於完整匯入,差異匯入組態需要更多組態。

    • 如果您選擇 [觸發程式] 或 [快照集] 方法來追蹤差異變更,請在 [記錄數據表] 或 [快照集資料庫名稱] 方塊中提供記錄數據表或快照集資料庫。
    • 您也需要在歷程記錄數據表與父數據表之間提供聯結條件,例如 Employee.ID=History.EmployeeID
    • 若要從歷程記錄資料表追蹤父數據表上的交易,您必須提供包含作業信息的數據行名稱(新增/更新/刪除)。
    • 如果您選擇 [浮浮水印] 來追蹤差異變更,請提供數據行名稱,其中包含浮列名稱中的作業資訊。
    • 變更類型需要變更 Type 屬性數據行。 此數據行會將主要數據表或多重值數據表中發生的變更對應至差異檢視中的變更類型。 此數據行可以包含屬性層級變更的Modify_Attribute變更類型,或物件層級變更類型的 Add、Modify 或刪除變更類型。 如果它不是預設值 Add、Modify 或 Delete 以外的值,您可以使用此選項來定義這些值。

    Export

    runstep7 映像

    一般 SQL 連接器支援使用四種支援的方法來匯出,例如:

    • Table
    • 檢視
    • 預存程序
    • SQL 查詢

    數據表/檢視
    如果您選擇 [數據表/檢視] 選項,則連接器會產生個別的查詢來執行匯出。

    預存程序
    runstep8 映像

    如果您選擇 [預存程式] 選項,匯出需要三個不同的預存程式來執行插入/更新/刪除作業。

    • 新增SP名稱:如果有任何物件來到連接器,以在個別數據表中插入,就會執行此SP。
    • 更新SP名稱:如果有任何物件來到連接器,以在個別數據表中更新,此SP就會執行。
    • 刪除SP名稱:如果有任何物件來到連接器,以在個別數據表中刪除,就會執行此SP。
    • 從架構中選取的屬性,做為預存程式的參數值。 例如, @EmployeeName: INPUT: EmployeeName 在連接器架構中選取 EmployeeName,連接器會在執行匯出時取代個別的值。
    • 若要執行參數化預存程式,請以格式提供參數 [Name]:[Direction]:[Value] 。 在個別行輸入每個參數(使用 Ctrl + Enter 取得新行)。

    SQL 查詢
    runstep9 映像

    如果您選擇 SQL 查詢選項,匯出需要三個不同的查詢來執行插入/更新/刪除作業。

    • 插入查詢:如果有任何物件來到連接器,以在個別數據表中插入,此查詢就會執行。
    • 更新查詢:如果有任何物件來到連接器,以在個別數據表中更新,此查詢就會執行。
    • 刪除查詢:如果有任何物件來到連接器,以在個別數據表中刪除,就會執行此查詢。
    • 例如,從做為查詢參數值之架構中選取的屬性 Insert into Employee (ID, Name) Values (@ID, @EmployeeName)

    重要

    CRLF 或新的行字元可作為多個語句之間的分隔符。

    範例多步驟更新 SQL 查詢 - 新行字元用來分隔 SQL 語句

    update Employee set jobTitle=@JOBTITLE where BusinessEntityID=@BUSINESSENTITYID
    insert into ChangeLog VALUES (@BUSINESSENTITYID)
    

    疑難排解

    • 如需如何啟用記錄以針對連接器進行疑難解答的資訊,請參閱 如何啟用連接器的 ETW 追蹤。