サブスクリプションを別の Microsoft Entra テナントに転送した後、Synapse サーバーレス SQL プールを使用できない
サブスクリプションを別の Microsoft Entra テナントに移動した場合、サーバーレス SQL プールでいくつかの問題が発生する可能性があります。 サポート チケットを作成すると、問題を解決するために Azure サポートから連絡があります。
ストレージ アクセス
Azure ストレージのファイルにアクセスしようとしてエラーが発生する場合は、データにアクセスするためのアクセス許可があることを確認します。 一般公開されているファイルにアクセスできる必要があります。 資格情報を使わないでデータにアクセスしようとする場合は、自身の Microsoft Entra ID でファイルに直接アクセスできることを確認します。
Azure Data Lake Storage のファイルの読み取り、一覧表示、またはアクセスができない
明示的な資格情報を使わないで Microsoft Entra ログインを使用している場合は、自身の Microsoft Entra ID でストレージのファイルにアクセスできることを確認します。 ファイルにアクセスするには、Microsoft Entra ID に BLOB データ閲覧者アクセス許可、または ADLS のアクセス制御リスト (ACL) の一覧表示および読み取りを行うアクセス許可が必要です。 詳しくは、「ファイルを開くことができないため、クエリが失敗する」をご覧ください。
SQL ログインとデータ ソースのないOPENROWSET 関数を使っている場合は、ストレージ URI と一致し、ストレージにアクセスするためのアクセス許可がある、サーバー レベルの資格情報を使っていることを確認します。
ファイルを開くことができないため、クエリが失敗する
File cannot be opened because it does not exist or it is used by another process というエラーでクエリが失敗したときに、ファイルが存在し、かつ別のプロセスで使用されていないことが確かな場合は、サーバーレス SQL プールからファイルにアクセスできません。 この問題が発生するのは、通常、Microsoft Entra ID にファイルへのアクセス権がないか、ファイアウォールによってファイルへのアクセスがブロックされているためです。
既定では、サーバーレス SQL プールは Microsoft Entra ID を使ってファイルへのアクセスを試みます。 この問題を解決するには、ファイルにアクセスするための適切な権限を持っている必要があります。 最も簡単な方法は、クエリ対象のストレージ アカウントに対するストレージ BLOB データ共同作成者ロールを自分に付与することです。
リンクされた DataVerse テーブルを読み取るために Dataverse に対する Azure Synapse Link を使っている場合は、サーバーレス SQL プールを使用してリンクされたデータにアクセスするために Microsoft Entra アカウントを使う必要があります。 詳しくは、Azure Data Lake での Azure Synapse Link for Dataverse に関する記事をご覧ください。
SQL ログインを使って、DataVerse テーブルを参照している外部テーブルを読み取ろうとした場合、次のエラーが発生します。External table '???' is not accessible because content of directory cannot be listed.
This query cannot be executed due to current resource constraints. というエラー メッセージでクエリが失敗する場合があります。このメッセージは、リソースの制約のため、現時点ではサーバーレス SQL プールが実行できないことを意味します。 トラブルシューティングのいくつかのオプションを次に示します。
テーブルまたはビューの一覧を表示し、オブジェクトが存在するかどうかを調べます。 Synapse Studio にはサーバーレス SQL プールで使用できない一部のテーブルが表示される可能性があるため、SQL Server Management Studio または Azure Data Studio を使います。
クエリ実行エンジンがデータを処理してクエリを実行しているノード間でデータを転送できない場合、Could not allocate tempdb space while transferring data from one distribution to another というエラーが返されます。 このエラーは、現在のリソース制約エラーによりクエリを実行できないため、汎用クエリが失敗する特殊なケースです。 このエラーは、tempdb データベースに割り当てられたリソースがクエリを実行するには不十分な場合に返されます。
サポート チケットを提出する前に、ベスト プラクティスを適用してください。
外部ファイルの処理中にエラーが発生してクエリが失敗する (最大エラー数に達しました)
error handling external file: Max errors count reached というエラー メッセージでクエリが失敗する場合は、指定した列の型と読み込む必要があるデータが一致していないことを意味します。
SELECT
TOP 100 *
FROM
OPENROWSET(
BULK'[FILE-PATH OF CSV FILE]',
FORMAT = 'CSV',
PARSER_VERSION='2.0',
FIELDTERMINATOR =';',
FIRSTROW = 2
)
WITH (
[ID] SMALLINT,
[Text] VARCHAR (7) COLLATE Latin1_General_BIN2
)
AS [result]
ファイルを開けなかったため、一括読み込みできない
エラー Cannot bulk load because the file could not be opened は、クエリの実行中にファイルが変更された場合に返されます。 通常、Cannot bulk load because the file {file path} could not be opened. Operating system error code 12. (The access code is invalid.) などのエラーが表示される場合があります
Bulk load data conversion error (type mismatches or invalid character for the specified code page) for row n, column m [columnname] in the data file [filepath]. というエラー メッセージでクエリが失敗する場合があります。このメッセージは、データ型が行番号 n および列 m の実際のデータと一致しなかったことを意味します。
たとえば、データ内は整数のみと予想したのに、行 n に文字列があった場合、このエラー メッセージが表示されます。
Id, first name,
1,Adam
2,Bob
3,Charles
4,David
five,Eva
次のクエリを使用する場合:
クエリ 1:
SQL
SELECT
TOP 100 *
FROM
OPENROWSET(
BULK'[FILE-PATH OF CSV FILE]',
FORMAT = 'CSV',
PARSER_VERSION='1.0',
FIELDTERMINATOR =',',
FIRSTROW = 2
)
WITH (
[ID] SMALLINT,
[Firstname] VARCHAR (25) COLLATE Latin1_General_BIN2
)
AS [result]
Azure Synapse サーバーレス SQL プールからエラー Bulk load data conversion error (type mismatch or invalid character for the specified code page) for row 6, column 1 (ID) in data file [filepath]. が返されます
この問題に対処するには、データを参照し、情報に基づいて決定する必要があります。 この問題の原因になっているデータを確認するには、最初にデータ型を変更する必要があります。 データ型 SMALLINT を使って ID 列のクエリを実行する代わりに、VARCHAR (100) を使ってこの問題を分析します。
この少し変更したクエリ 2 を使うと、データを処理して名前の一覧を返すことができるようになります。
クエリ 2:
SQL
SELECT
TOP 100 *
FROM
OPENROWSET(
BULK'[FILE-PATH OF CSV FILE]',
FORMAT = 'CSV',
PARSER_VERSION='1.0',
FIELDTERMINATOR =',',
FIRSTROW = 2
)
WITH (
[ID] VARCHAR(100),
[Firstname] VARCHAR (25) COLLATE Latin1_General_BIN2
)
AS [result]
データの 5 行目の ID に予期しない値が含まれている場合があります。 このような状況では、データのビジネス所有者と、この例のようなデータの破損を回避する方法について同意することが重要です。 アプリケーション レベルで防止できなければ、適切なサイズの VARCHAR が唯一の選択肢になる可能性があります。
列 Firstname に値がないようです。 代わりに、すべての値が ID 列に含まれています。 それらの値は、コンマで区切られています。 この問題は、フィールド ターミネータとしてセミコロン記号の代わりにコンマを選択する必要があるコード行によって発生しました。
SQL
FIELDTERMINATOR =';',
この 1 文字を変更すると、問題が解決します。
SQL
FIELDTERMINATOR =',',
クエリ 2 によって作成される結果セットは、想定したとおりになります。
クエリ 2:
SQL
SELECT
TOP 100 *
FROM
OPENROWSET(
BULK'[FILE-PATH OF CSV FILE]',
FORMAT = 'CSV',
PARSER_VERSION='1.0',
FIELDTERMINATOR =',',
FIRSTROW = 2
)
WITH (
[ID] VARCHAR(100),
[Firstname] VARCHAR (25) COLLATE Latin1_General_BIN2
)
AS [result]
戻り値:
出力
| ID | Firstname |
| ------------- |------------- |
| 1 | Adam |
| 2 | Bob |
| 3 | Charles |
| 4 | David |
| 5 | Eva |
列の型が外部データ型と互換性がない
Column [column-name] of type [type-name] is not compatible with external data type […], というエラー メッセージでクエリが失敗する場合は、PARQUET データ型が正しくない SQL データ型にマップされた可能性があります。
たとえば、Parquet ファイルに浮動小数点数 (12.89 など) の価格の列があり、それを INT にマップしようとした場合、このようなエラー メッセージが表示されます。
SELECT
*
FROM
OPENROWSET(
BULK'<filepath>taxi-data.parquet',
FORMAT='PARQUET'
) WITh
(
PassengerCount INT,
SumTripDistance INT,
AVGTripDistance FLOAT
)
AS [result]
Column 'SumTripDistance' of type 'INT' is not compatible with external data type 'Parquet physical type: DOUBLE', please try with 'FLOAT'. File/External table name: '<filepath>taxi-data.parquet'.
SELECT
*
FROM
OPENROWSET(
BULK'<filepath>taxi-data.parquet',
FORMAT='PARQUET'
) WITh
(
PassengerCount INT,
SumTripDistance FLOAT,
AVGTripDistance FLOAT
)
AS [result]
クエリが分散処理モードでサポートされていないオブジェクトを参照している
エラー The query references an object that is not supported in distributed processing mode は、Azure Storage または Azure Cosmos DB 分析ストレージのデータのクエリ中に使用できないオブジェクトまたは関数を使用したことを示します。
一部のオブジェクト (システム ビューなど) と関数は、Azure Data Lake または Azure Cosmos DB 分析ストレージに格納されているデータのクエリの間は使用できません。 外部データをシステム ビューと結合したり、一時テーブルに外部データを読み込むクエリを使用したり、一部のセキュリティ関数またはメタデータ関数を使用して外部データをフィルター処理したりしないようにします。
次のようなエラー メッセージが表示される場合もあります: File {path} cannot be opened because it does not exist or it is used by another process.
Microsoft Entra 認証トークンは、クライアント アプリケーションによってキャッシュされる場合があります。 たとえば、Power BI は Microsoft Entra トークンをキャッシュし、1 時間にわたって同じトークンを再利用します。 実行時間の長いクエリの場合、実行の途中でトークンの有効期限が切れると、失敗する可能性があります。
次の軽減策を検討してください。
クライアント アプリケーションを再起動して、新しい Microsoft Entra トークンを取得します。
返されるエラー メッセージでは、次の形式が使用される場合もあります: Cannot bulk load because the file 'https://????.dfs.core.windows.net/????' could not be opened. Operating system error code 12 (The access code is invalid.).
次のパターンのようなエラー メッセージが表示される場合もあります: File {path} cannot be opened because it does not exist or it is used by another process.
Microsoft Entra 認証トークンは、クライアント アプリケーションによってキャッシュされる場合があります。 たとえば、Power BI は Microsoft Entra トークンをキャッシュし、1 時間にわたってこれをを再利用します。 実行時間の長いクエリの場合、実行の途中でトークンの有効期限が切れると、失敗する可能性があります。
問題を解決するには、次の軽減策を検討してください。
クライアント アプリケーションを再起動して、新しい Microsoft Entra トークンを取得します。
Inserting value to batch for column type DATETIME2 failed というエラーは、サーバーレス プールが基になるファイルの日付値を読み取りできないことを示します。 Parquet または Delta Lake ファイルに格納されている datetime 値を DATETIME2 列として表すことはできません。
Please create a master key in the database or open the master key in the session before performing this operation. というエラー メッセージでクエリが失敗する場合は、ユーザー データベースが現時点でマスター キーにアクセスできないことを意味します。
エラー メッセージ Failed to execute query. Error: CREATE EXTERNAL TABLE/DATA SOURCE/DATABASE SCOPED CREDENTIAL/FILE FORMAT is not supported in master database. でクエリが失敗した場合は、サーバーレス SQL プール内の master データベースが以下の作成をサポートしていないことを意味します。
WITH 句の列名またはパス式が間違っている可能性があります。 WITH 句の列名 (または列の型の後のパス式) は、Azure Cosmos DB コレクションのプロパティ名と一致する必要があります。 比較では、"大文字と小文字が区別されます"。 たとえば、productCode と ProductCode は異なるプロパティです。 列名が Azure Cosmos DB のプロパティ名と完全に一致することを確認します。
WITH 句に指定された列の型が Azure Cosmos DB コンテナーの型と一致しない場合、エラー Column 'column name' of the type 'type name' is not compatible with the external data type 'type name'. が返されます。 セクション「Azure Cosmos DB から SQL 型へのマッピング」で説明されているように列の型を変更するか、または VARCHAR 型を使用してください。
Azure Cosmos DB のパスの解決がエラーで失敗する
Resolving Azure Cosmos DB path has failed with error 'This request is not authorized to perform this operation'. というエラーが発生する場合は、Azure Cosmos DB でプライベート エンドポイントを使用したかどうかを確認します。 プライベート エンドポイントを使用してサーバーレス SQL プールで分析ストアにアクセスできるようにするには、Azure Cosmos DB 分析ストアのプライベート エンドポイントを構成する必要があります。
このエラーは、サーバーレス SQL プールが Delta Lake トランザクション ログを読み取ることができないことを示します。 次のエラーが表示されることがあります。
Msg 13609, Level 16, State 4, Line 1
JSON text is not properly formatted. Unexpected character '' is found at position 263934.
Msg 16513, Level 16, State 0, Line 1
Error reading external metadata.
Delta Lake データ セットが破損していないことを確認します。 Azure Synapse の Apache Spark プールを使用して、Delta Lake フォルダーの内容を読み取ることができることを確認します。 これにより、_delta_log ファイルが破損していないことを確認します。
回避策
Apache Spark プールを使って Delta Lake データセットにチェックポイントを作成し、クエリを再実行してみます。 チェックポイントによってトランザクションの JSON ログ ファイルが集計され、問題が解決する可能性があります。
Dataverse テーブルを Azure Data Lake Storage から Data Lake にエクスポートしていて、Lake データベースにスナップショット データ (_partitioned サフィックスが付いたテーブル) が表示されない場合は、エクスポートされたデータを含む ADLS ストレージに対する読み取りアクセス権がワークスペースのマネージド ID にあることを確認してください。 サーバーレス SQL プールは、マネージド ID のアクセス権を使用してエクスポートされたデータのスキーマを読み取り、テーブル スキーマを作成します。
Lake データベースの Delta テーブルは、サーバーレス SQL プールでは使用できません
ワークスペースのマネージド ID が、Delta フォルダーを含む ADLS ストレージに対する読み取りアクセス権を持っていることを確認します。 サーバーレス SQL プールは、ADLS に配置された Delta ログから Delta Lake テーブル スキーマを読み取り、ワークスペースのマネージド ID を使用して Delta トランザクション ログにアクセスします。
マネージド ID 資格情報を使用して Azure Data Lake Storage を参照するデータ ソースを一部の SQL Database に設定し、マネージド ID を持つデータ ソースの上に外部テーブルを作成して、マネージド ID を持つテーブルがストレージにアクセスできることを確認します。
Lake データベースの Delta テーブルのスキーマが Spark とサーバーレス プールで異なる
CETAS コマンドにクエリを入力し、クエリの実行時間を測定します。 CETAS コマンドは、結果を Azure Data Lake Storage に格納し、クライアント接続に依存しません。 CETAS コマンドが元のクエリよりも速く終了する場合は、クライアントとサーバーレス SQL プール間のネットワーク帯域幅を確認します。
Synapse Studio を使用して実行するとクエリが遅くなる
Synapse Studio を使っている場合は、SQL Server Management Studio や Azure Data Studio などのデスクトップ クライアントを使用してみてください。 Synapse Studio は、HTTP プロトコルを使ってサーバーレス SQL プールに接続する Web クライアントです。これは一般的に、SQL Server Management Studio または Azure Data Studio で使用されるネイティブ SQL 接続より低速です。
ユーザーがレイクハウスや Spark のデータベースにアクセスできない場合、データベースにアクセスして読み取るためのアクセス許可がユーザーにない可能性があります。 CONTROL SERVER アクセス許可を持つユーザーには、すべてのデータベースへのフル アクセス権があるはずです。 制限付きアクセス許可として、CONNECT ANY DATABASE と SELECT ALL USER SECURABLES の使用を試みる場合があります。
SQL ユーザーが Dataverse テーブルにアクセスできない
Dataverse のテーブルは、呼び出し元の Microsoft Entra ID を使ってストレージにアクセスします。 高いアクセス許可を持つ SQL ユーザーがテーブルからデータを選択しようとしても、テーブルは Dataverse データにアクセスできません。 このシナリオはサポートされていません。
別のサービス プリンシパル識別子 (SPI) を使用して SPI または Microsoft Entra アプリのロールの割り当てを作成する場合、または既に作成済みでサインインに失敗した場合は、次のエラーが表示される可能性があります: Login error: Login failed for user '<token-identified principal>'.
サービス プリンシパルのログインは、セキュリティ ID (SID) として、オブジェクト ID ではなくアプリケーション ID を使って作成する必要があります。 サービス プリンシパルには既知の制限があり、別の SPI やアプリに対してロールの割り当てを作成するときに、Azure Synapse が Microsoft Graph からアプリケーション ID をフェッチできないようになっています。