Azure / Azure/data-api-builder

[Bug]: cannot map stored procedure on Postgres

Abierto
#2,758 3 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

bug known-issue pgsql triage
Lenguaje dominante
C#
Estrellas
1.5k
Forks
372
Merge medio
3 d 22 h
PR fusionados (30 d)
9

Descripción

### 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

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza en src/Core/Services/MetadataProviders/SqlMetadataProvider.cs, en FillSchemaForStoredProcedureAsync, donde el proveedor de PostgreSQL llama a NpgsqlConnection.GetSchemaAsync con Procedures. Reproduce el fallo usando la configuración del procedimiento almacenado y verifica que una entidad de procedimiento almacenado de PostgreSQL pueda completar la inicialización en runtime sin el error Invalid collection name.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
csharp, postgresql
Área
databases
Tipo de issue
Error
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
42/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.