Linux上でSQL Server on Linuxの一括インポート操作を設定する

適用対象: Linux 上の SQL Server 2022 (16.x) 以降のバージョン

SQL Server 2022(16.x)累積アップデート27(CU27)およびSQL Server 2025(17.x)累積アップデート9(CU9)からは、bulkadmin固定サーバーロールまたはADMINISTER BULK OPERATIONS権限を使ってLinux上で動作する大SQL Serverデータインポート操作を行うことができます。 以前は 、sysadmin の固定サーバー役割のメンバーのみがLinux上で BULK INSERT または OPENROWSET(BULK...) を実行できました。

SQL Server on Linuxは、Windowsで求められる以上の追加ファイルシステムおよびパス検証チェックを一括操作で強制します。 管理者は次の操作を行う必要があります。

  • ユーザーに適切な SQL Server アクセス許可を付与する
  • データ ファイルに対する Linux ファイル システムのアクセス許可を付与する
  • 明示的にディレクトリパスを承認します mssql-conf

前提条件

  • Linux版のSQL Server 2022(16.x)CU 27以降バージョン、またはLinux版のSQL Server 2025(17.x)CU 9以降バージョン
  • 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 文字以下にする必要があります。
  • パスには無効な文字 (ヌル文字、改行、キャリッジリターン、またはタブ) を含めてはいけません。
  • シンボリック リンクは許可されません。
  • パスはディレクトリを参照する必要があります。

禁止されている経路

システムは、いくつかの重要なパスを設計によってブロックします。 許可されたパスの一覧に追加した場合でも、これらの場所を一括操作のソース データ ファイル パスとして使用することはできません。

  • /var/opt/mssql (または SQL Server インストール ディレクトリ)
  • /var/opt/azcmagent/certs
  • /var/opt/azcmagent/tokens

これらのパスからソース データを読み取る一括操作は、セキュリティ上の理由から失敗します。 この制限は、既定で SQL Server データ ディレクトリを使用する ERRORFILE 出力パスには適用されません。

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 = '<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にインポートする」を参照してください。

アップグレードとダウングレードの動作

SQL Server 2022(16.x)CU 24またはSQL Server 2025(17.x)CU 3より前の累積更新にダウングレードした場合:

  • 以前に付与されたアクセス許可は割り当てられたままですが、機能しません。

  • 大量運用には システム管理者 の権限が必要です。