Azure / Azure/data-api-builder

[Bug]: cannot map stored procedure on Postgres

オープン
#2,758 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る
bug known-issue pgsql triage
主要言語
C#
スター
1.5k
フォーク
372
平均マージ
3日 22時間
マージ済み PR(30日)
9

説明

### What happened?

I have an entity mapped with the following definition in the config file:
```json
...
"azets_insert_altinn_response": {
"source": {
"object": "azets.insert_altinn_response",
"type": "stored-procedure",
"parameters": {
"jobid": "number",
"jobtype": "string",
"response": "string"
}
},
"rest": {
"methods": [
"POST"
]
},
"permissions": [
{
"role": "authenticated",
"actions": [
"execute"
]
}
]
},
...
```

However at startup DAB gives the following error:
```
fail: Azure.DataApiBuilder.Service.Startup[0]
Unable to complete runtime initialization. Refer to exception for error details.
Azure.DataApiBuilder.Service.Exceptions.DataApiBuilderException: Cannot obtain Schema for entity azets_insert_altinn_response with underlying database object source: azets.insert_altinn_response due to: Invalid collection name. (Parameter 'collectionName')
Actual value was Procedures.
---> System.ArgumentOutOfRangeException: Invalid collection name. (Parameter 'collectionName')
Actual value was Procedures.
at Npgsql.NpgsqlSchema.GetSchema(Boolean async, NpgsqlConnection conn, String collectionName, String[] restrictions, CancellationToken cancellationToken)
at Npgsql.NpgsqlConnection.GetSchemaAsync(String collectionName, String[] restrictions, CancellationToken cancellationToken)
at Azure.DataApiBuilder.Core.Services.SqlMetadataProvider`3.FillSchemaForStoredProcedureAsync(Entity procedureEntity, String entityName, String schemaName, String storedProcedureSourceName, StoredProcedureDefinition storedProcedureDefinition) in /_/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs:line 411
--- End of inner exception stack trace ---
at Azure.DataApiBuilder.Core.Services.SqlMetadataProvider`3.HandleOrRecordException(Exception e) in /_/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs:line 101
at Azure.DataApiBuilder.Core.Services.SqlMetadataProvider`3.PopulateObjectDefinitionForEntity(String entityName, Entity entity) in /_/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs:line 1117
at Azure.DataApiBuilder.Core.Services.SqlMetadataProvider`3.PopulateObjectDefinitionForEntities() in /_/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs:line 1055
at Azure.DataApiBuilder.Core.Services.SqlMetadataProvider`3.InitializeAsync() in /_/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs:line 290
at Azure.DataApiBuilder.Core.Services.MetadataProviders.MetadataProviderFactory.InitializeAsync() in /_/src/Core/Services/MetadataProviders/MetadataProviderFactory.cs:line 92
at Azure.DataApiBuilder.Service.Startup.PerformOnConfigChangeAsync(IApplicationBuilder app) in /_/src/Service/Startup.cs:line 858
fail: Azure.DataApiBuilder.Service.Startup[0]
Could not initialize the engine with the runtime config file: /opt/dab-config.json
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
fail: Microsoft.Extensions.Hosting.Internal.Host[11]
Hosting failed to start
System.Threading.Tasks.TaskCanceledException: A task was canceled.
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
at Microsoft.Extensions.Hosting.Internal.Host.b__15_1(IHostedService service, CancellationToken token)
at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation)
Unable to launch the Data API builder engine.
```

### Version

1.5.56

### What database are you using?

PostgreSQL

### What hosting model are you using?

Custom Docker host

### Which API approach are you accessing DAB through?

REST

### Relevant log output

```Text
fail: Azure.DataApiBuilder.Service.Startup[0]
Unable to complete runtime initialization. Refer to exception for error details.
Azure.DataApiBuilder.Service.Exceptions.DataApiBuilderException: Cannot obtain Schema for entity azets_insert_altinn_response with underlying database object source: azets.insert_altinn_response due to: Invalid collection name. (Parameter 'collectionName')
Actual value was Procedures.
---> System.ArgumentOutOfRangeException: Invalid collection name. (Parameter 'collectionName')
Actual value was Procedures.
at Npgsql.NpgsqlSchema.GetSchema(Boolean async, NpgsqlConnection conn, String collectionName, String[] restrictions, CancellationToken cancellationToken)
at Npgsql.NpgsqlConnection.GetSchemaAsync(String collectionName, String[] restrictions, CancellationToken cancellationToken)
at Azure.DataApiBuilder.Core.Services.SqlMetadataProvider`3.FillSchemaForStoredProcedureAsync(Entity procedureEntity, String entityName, String schemaName, String storedProcedureSourceName, StoredProcedureDefinition storedProcedureDefinition) in /_/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs:line 411
--- End of inner exception stack trace ---
at Azure.DataApiBuilder.Core.Services.SqlMetadataProvider`3.HandleOrRecordException(Exception e) in /_/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs:line 101
at Azure.DataApiBuilder.Core.Services.SqlMetadataProvider`3.PopulateObjectDefinitionForEntity(String entityName, Entity entity) in /_/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs:line 1117
at Azure.DataApiBuilder.Core.Services.SqlMetadataProvider`3.PopulateObjectDefinitionForEntities() in /_/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs:line 1055
at Azure.DataApiBuilder.Core.Services.SqlMetadataProvider`3.InitializeAsync() in /_/src/Core/Services/MetadataProviders/SqlMetadataProvider.cs:line 290
at Azure.DataApiBuilder.Core.Services.MetadataProviders.MetadataProviderFactory.InitializeAsync() in /_/src/Core/Services/MetadataProviders/MetadataProviderFactory.cs:line 92
at Azure.DataApiBuilder.Service.Startup.PerformOnConfigChangeAsync(IApplicationBuilder app) in /_/src/Service/Startup.cs:line 858
fail: Azure.DataApiBuilder.Service.Startup[0]
Could not initialize the engine with the runtime config file: /opt/dab-config.json
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
fail: Microsoft.Extensions.Hosting.Internal.Host[11]
Hosting failed to start
System.Threading.Tasks.TaskCanceledException: A task was canceled.
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
at Microsoft.Extensions.Hosting.Internal.Host.b__15_1(IHostedService service, CancellationToken token)
at Microsoft.Extensions.Hosting.Internal.Host.ForeachService[T](IEnumerable`1 services, CancellationToken token, Boolean concurrent, Boolean abortOnFirstException, List`1 exceptions, Func`3 operation)
Unable to launch the Data API builder engine.
```

### Code of Conduct

- [x] I agree to follow this project's Code of Conduct

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

src/Core/Services/MetadataProviders/SqlMetadataProvider.cs の FillSchemaForStoredProcedureAsync から始めます。ここで PostgreSQL プロバイダーは Procedures を指定して NpgsqlConnection.GetSchemaAsync を呼び出します。ストアドプロシージャの構成を使用して失敗を再現し、PostgreSQL のストアドプロシージャエンティティが Invalid collection name エラーなしでランタイム初期化を完了できることを確認します。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
csharp, postgresql
領域
databases
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
説明が足りない
初心者へのやさしさ
42/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。