共用方式為


在 Linux 上配置 SQL Server 的批量匯入操作(預覽版)

適用於: Linux 上的 SQL Server 2025 (17.x)

這很重要

此功能目前為預覽狀態。

從 SQL Server 2025(17.x)累積更新(CU)3 開始,你可以使用 bulkadmin 伺服器角色或權限 ADMINISTER BULK OPERATIONS 在運行於 Linux 上的 SQL Server 執行批量資料匯入操作。 過去只有系統管理員伺服器角色的成員能在 Linux 上執行 BULK INSERTOPENROWSET(BULK...)。

Linux 上的 SQL Server 對批次操作還會強制執行額外的檔案系統和路徑驗證檢查,這比 Windows 上要求的還要多。 管理員必須:

  • 授予使用者適當的 SQL Server 權限
  • 授予 Linux 檔案系統對資料檔案的權限
  • 明確核准使用 mssql-conf 的目錄路徑

先決條件

  • SQL Server 2025 (17.x) CU 3 或更新版本(Linux 版)
  • Linux 主機的管理存取權
  • 對 SQL Server 實例的管理存取權限

配置 Linux 檔案系統

在執行批量匯入操作之前, mssql 服務帳號必須能讀取 Linux 檔案系統中的資料檔案。

  1. 建立一個資料夾來存放你的大量資料檔案:

    mkdir -p /tmp/bulkload/sales/
    
  2. 建立範例資料檔:

    cat > /tmp/bulkload/sales/loadsalesdata.csv << EOF
    Id,CustomerName,OrderDate,Amount
    1,John Doe,2026-02-01,500.75
    2,Jane Smith,2026-02-05,1500.20
    3,Mark Lee,2026-02-10,320.50
    4,Alice Johnson,2026-02-15,785.00
    5,Bob Brown,2026-02-20,930.40
    EOF
    
  3. 在資料檔案上授予 SQL Server 程序帳號(mssql)讀取權限:

    setfacl -m u:mssql:r /tmp/bulkload/sales/loadsalesdata.csv
    

使用 mssql-conf 設定允許路徑

管理員必須在mssql-conf中使用bulkadmin.allowedpathslist設置以核准可供大量操作讀取的目錄。 此變更立即生效,且不需重新啟動 SQL Server 服務。

sudo /opt/mssql/bin/mssql-conf set bulkadmin.allowedpathslist "/tmp/bulkload/sales"

若要指定多個目錄,請以冒號:分隔每條路徑:

sudo /opt/mssql/bin/mssql-conf set bulkadmin.allowedpathslist "/tmp/bulkload/sales:/tmp/bulkload/marketing"

或者,你也可以指定一個父目錄,以便允許其下的所有子目錄存取。

路徑限制

以下限制適用於用於批量操作的路徑:

  • 這個路徑必須是絕對路徑。 不允許包含 ... 的相對路徑。
  • 根路徑/()不被允許。
  • 路徑不得超過4,096字元。
  • 路徑中不得包含無效字元(null、換行、回車或 tab)。
  • 不允許使用符號連結。
  • 路徑必須指向目錄。

禁忌之路

系統設計上會阻擋部分關鍵路徑。 即使你把這些位置加入允許路徑清單,你也不能把這些位置當作大量操作的來源資料檔案路徑:

  • /var/opt/mssql (或 SQL Server 安裝目錄)
  • /var/opt/azcmagent/certs
  • /var/opt/azcmagent/tokens

從這些路徑讀取來源資料的批量操作因安全考量而失敗。 此限制不適用於 ERRORFILE 輸出路徑,該路徑預設使用 SQL Server 資料目錄。

設定 SQL Server 權限

在你設定好 Linux 檔案系統和允許的路徑後,為執行批量匯入的使用者設定 SQL Server 權限。

  1. 連接 SQL Server 實例並建立範例資料庫與資料表:

    CREATE DATABASE demodbforbulkinsert;
    GO
    
    USE demodbforbulkinsert;
    GO
    
    CREATE TABLE dbo.Sales (
        Id INT NOT NULL PRIMARY KEY,
        CustomerName NVARCHAR(200) NOT NULL,
        OrderDate DATE NOT NULL,
        Amount DECIMAL(18, 2) NOT NULL
    );
    GO
    
  2. 為批量匯入使用者建立登入帳號:

    USE master;
    GO
    
    CREATE LOGIN BulkLoadUser WITH PASSWORD = '<strong_password>';
    GO
    
  3. 授予 ADMINISTER BULK OPERATIONS 權限或將登入帳號新增至 bulkadmin 伺服器角色。 使用下列其中一個選項:

    -- Option 1: Add to the bulkadmin server role
    ALTER SERVER ROLE bulkadmin ADD MEMBER BulkLoadUser;
    GO
    
    -- Option 2: Grant the permission directly
    GRANT ADMINISTER BULK OPERATIONS TO BulkLoadUser;
    GO
    
  4. 建立資料庫使用者並授予必要的資料表權限:

    USE demodbforbulkinsert;
    GO
    
    CREATE USER BulkLoadUser FOR LOGIN BulkLoadUser;
    GO
    
    GRANT INSERT, SELECT ON dbo.Sales TO BulkLoadUser;
    GO
    

執行一次批量匯入

使用BulkLoadUser登入連接資料庫並執行批量匯入:

USE demodbforbulkinsert;
GO

BULK INSERT dbo.Sales
FROM '/tmp/bulkload/sales/loadsalesdata.csv'
WITH (
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',
    ERRORFILE = '/var/opt/mssql/data/bulk_errors'
);
GO

-- Verify the imported data
SELECT * FROM dbo.Sales;
GO

同樣的權限、Linux 檔案系統設定與路徑核准步驟也適用於 INSERT ... SELECT * FROM OPENROWSET(BULK...) 語句。 欲了解更多資訊,請參閱 使用 BULK INSERT 或 OPENROWSET(BULK...) 匯入大量資料

升級與降級行為

自 SQL Server 2025(17.x)CU 3 起,Linux 上的 SQL Server 支援使用 bulkadmin 角色或 ADMINISTER BULK OPERATIONS 權限進行批量操作。

如果你卸載了 CU 3 或降級到較早的累積更新:

  • 先前授予的權限仍保留在指定狀態,但無法正常運作。
  • 批次操作需要系統 管理員 權限,與 CU 3 之前的版本相同。