适用于: Linux 上的 SQL Server 2025 (17.x)
重要
此功能目前处于预览状态。
从 SQL Server 2025 (17.x) 累积更新 (CU) 3 开始,可以使用 bulkadmin 服务器角色或 ADMINISTER BULK OPERATIONS 权限在 Linux 上运行的 SQL Server 上执行批量数据导入操作。 以前,只有 sysadmin 服务器角色的成员才能在 Linux 上运行 BULK INSERT 或 OPENROWSET(BULK...)。
Linux 上的 SQL Server 对批量操作强制实施其他文件系统和路径验证检查,超出 Windows 上所需的内容。 管理员必须:
- 向用户授予适当的 SQL Server 权限
- 授予对数据文件的 Linux 文件系统权限
- 使用
mssql-conf显式批准目录路径
先决条件
- Linux 上的 SQL Server 2025 (17.x) CU 3 或更高版本
- 对 Linux 主机的管理访问权限
- 对 SQL Server 实例的管理访问权限
配置 Linux 文件系统
在运行批量导入操作之前, mssql 服务帐户必须具有对 Linux 文件系统上的数据文件的读取访问权限。
为大容量数据文件创建目录:
mkdir -p /tmp/bulkload/sales/创建示例数据文件:
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授予 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 权限。
连接到 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为批量导入用户创建登录名:
USE master; GO CREATE LOGIN BulkLoadUser WITH PASSWORD = '<strong_password>'; GO授予
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创建数据库用户并授予所需的表权限:
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 之前的版本中一样。