通过


为 Linux 上的 SQL Server 配置批量导入操作(预览版)

适用于: Linux 上的 SQL Server 2025 (17.x)

重要

此功能目前处于预览状态。

从 SQL Server 2025 (17.x) 累积更新 (CU) 3 开始,可以使用 bulkadmin 服务器角色或 ADMINISTER BULK OPERATIONS 权限在 Linux 上运行的 SQL Server 上执行批量数据导入操作。 以前,只有 sysadmin 服务器角色的成员才能在 Linux 上运行 BULK INSERTOPENROWSET(BULK...)。

Linux 上的 SQL Server 对批量操作强制实施其他文件系统和路径验证检查,超出 Windows 上所需的内容。 管理员必须:

  • 向用户授予适当的 SQL Server 权限
  • 授予对数据文件的 Linux 文件系统权限
  • 使用 mssql-conf 显式批准目录路径

先决条件

  • Linux 上的 SQL Server 2025 (17.x) CU 3 或更高版本
  • 对 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 配置允许的路径

管理员必须使用bulkadmin.allowedpathslist中的设置,在mssql-conf中批准批量操作读取的目录。 此更改会立即生效,不需要重启 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、换行符、回车符或制表符)。
  • 不允许符号链接。
  • 路径必须引用目录。

禁止路径

系统设计会阻止某些关键路径。 不能将这些位置用作批量操作的源数据文件路径,即使将它们添加到允许的路径列表:

  • /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 或降级到较早的累积更新:

  • 以前授予的权限仍已分配,但不起作用。
  • 批量操作需要 sysadmin 权限,就像 CU 3 之前的版本中一样。