norBIT / alkisimport

ALKIS-Import
http://www.norbit.de/68/
GNU General Public License v2.0
28 stars 17 forks source link

alkis_set_schema(text) führt CREATE SCHEMA aus ohne pg_namespace zu prüfen #56

Closed ewie closed 1 year ago

ewie commented 1 year ago

Ein User ohne Privilege CREATE auf der Datenbank wollte alkisimport über QGIS ausführen. Das schlug fehl, obwohl Schema alkis bereits existiert:

2023-02-28 08:39:09.384915  > psql:alkis-functions.sql:39: ERROR:  permission denied for database ****|
2023-02-28 08:39:09.388727  > CONTEXT:  SQL statement "CREATE SCHEMA alkis"|
2023-02-28 08:39:09.405053  > PL/pgSQL function pg_temp_15.alkis_set_schema(text) line 6 at EXECUTE|
2023-02-28 08:39:09.414839  > psql:alkis-functions.sql:39: STATEMENT:  SELECT pg_temp.alkis_set_schema('alkis');|

Nachdem ich dem User Privilege CREATE auf der Datenbank gegeben hatte funktionierte der Import.

Die Fehlerursache ist, dass alkis_set_schema(text) ein vorhandenes Schema mittels Exception behandelt, anstatt pg_namespace zu prüfen:

https://github.com/norBIT/alkisimport/blob/e393be3a435fb2bb212a9f37489656c219099f9b/alkis-functions.sql#L21-L26

Der Import sollte bei einem vorhandenem Schema nicht daran scheitern, dass Privilege CREATE fehlt.

Zum Vergleich: alkis-import.sh und alkisImport.py prüfen dagegen zuerst pg_namespace:

https://github.com/norBIT/alkisimport/blob/e393be3a435fb2bb212a9f37489656c219099f9b/alkis-import.sh#L557-L561

https://github.com/norBIT/alkisimport/blob/e393be3a435fb2bb212a9f37489656c219099f9b/alkisImport.py#L667-L675

Owner der Schemas alkis und postgis ist Rolle gis_owner, deren Mitglied der User ist. gis_owner hat Default Privileges auf den beiden Schemas. Der User hat somit alle Berechtigungen, um über alkisimport in Schemas alkis und postgis Datenbankobjekte erstellen zu lassen. Datenbankowner ist postgres.

=# \dn alkis|postgis
   List of schemas
  Name   |   Owner
---------+-----------
 alkis   | gis_owner
 postgis | gis_owner
(2 rows)

Der Fehler in alkis.alkis_importlog im Detail:

2023-02-28 08:39:07.895021  Import-Version: e393be3
2023-02-28 08:39:08.569379  Datenbank-Version: PostgreSQL 12.14, compiled by Visual C++ build 1914, 64-bit
2023-02-28 08:39:08.596882  PostGIS-Version: 3.3 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
2023-02-28 08:39:08.640651  BEFEHL: 'C:\OSGeo4W\bin\ogr2ogr.exe' '--version'
2023-02-28 08:39:08.929065  > GDAL 3.5.3, released 2022/10/21|
2023-02-28 08:39:08.932006  
2023-02-28 08:39:08.940242  EXITCODE: 0
2023-02-28 08:39:08.948722  BEFEHL: 'C:\OSGeo4W\bin\psql.exe' '--version'
2023-02-28 08:39:09.039179  > psql (PostgreSQL) 14.3|
2023-02-28 08:39:09.05084   
2023-02-28 08:39:09.052486  EXITCODE: 0
2023-02-28 08:39:09.145827  Gesamtgröße des Imports: 116MiB
2023-02-28 08:39:09.165183  BEFEHL: 'C:\OSGeo4W\bin\psql.exe' '-v' 'alkis_epsg=25832' '-v' 'alkis_schema=alkis' '-v' 'postgis_schema=postgis' '-v' 'parent_schema=alkis' '-v' 'alkis_fnbruch=true' '-v' 'alkis_pgverdraengen=false' '-v' 'alkis_avoiddupes=false' '-v' 'alkis_hist=false' '-v' 'ON_ERROR_STOP=1' '-v' 'ECHO=errors' '--quiet' '--no-psqlrc' '-f' 'alkis-clean.sql' 'host=**** port=5432 dbname=**** user=**** password=*removed*'
2023-02-28 08:39:09.384915  > psql:alkis-functions.sql:39: ERROR:  permission denied for database ****|
2023-02-28 08:39:09.388727  > CONTEXT:  SQL statement "CREATE SCHEMA alkis"|
2023-02-28 08:39:09.405053  > PL/pgSQL function pg_temp_15.alkis_set_schema(text) line 6 at EXECUTE|
2023-02-28 08:39:09.414839  > psql:alkis-functions.sql:39: STATEMENT:  SELECT pg_temp.alkis_set_schema('alkis');|
2023-02-28 08:39:09.427772  
2023-02-28 08:39:09.430118  Fehler bei Prozeß: 3
2023-02-28 08:39:09.432238  EXITCODE: 3
2023-02-28 08:39:09.433989  Datenbankleerung schlug fehl.
2023-02-28 08:39:45.644951  Import-Version: e393be3
2023-02-28 08:39:45.65327   Datenbank-Version: PostgreSQL 12.14, compiled by Visual C++ build 1914, 64-bit
2023-02-28 08:39:45.673573  PostGIS-Version: 3.3 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
2023-02-28 08:39:45.68551   BEFEHL: 'C:\OSGeo4W\bin\ogr2ogr.exe' '--version'
2023-02-28 08:39:45.817313  > GDAL 3.5.3, released 2022/10/21|
2023-02-28 08:39:45.832485  
2023-02-28 08:39:45.834489  EXITCODE: 0
2023-02-28 08:39:45.838148  BEFEHL: 'C:\OSGeo4W\bin\psql.exe' '--version'
2023-02-28 08:39:45.931515  > psql (PostgreSQL) 14.3|
2023-02-28 08:39:45.942698  
2023-02-28 08:39:45.946863  EXITCODE: 0
2023-02-28 08:39:46.0443    Gesamtgröße des Imports: 116MiB
2023-02-28 08:39:46.062396  BEFEHL: 'C:\OSGeo4W\bin\psql.exe' '-v' 'alkis_epsg=25832' '-v' 'alkis_schema=alkis' '-v' 'postgis_schema=postgis' '-v' 'parent_schema=alkis' '-v' 'alkis_fnbruch=true' '-v' 'alkis_pgverdraengen=false' '-v' 'alkis_avoiddupes=false' '-v' 'alkis_hist=false' '-v' 'ON_ERROR_STOP=1' '-v' 'ECHO=errors' '--quiet' '--no-psqlrc' '-f' 'alkis-init.sql' 'host=**** port=5432 dbname=**** user=**** password=*removed*'
2023-02-28 08:39:46.237087  > psql:alkis-functions.sql:39: ERROR:  permission denied for database ****|
2023-02-28 08:39:46.241561  > CONTEXT:  SQL statement "CREATE SCHEMA alkis"|
2023-02-28 08:39:46.248274  > PL/pgSQL function pg_temp_14.alkis_set_schema(text) line 6 at EXECUTE|
2023-02-28 08:39:46.254618  > psql:alkis-functions.sql:39: STATEMENT:  SELECT pg_temp.alkis_set_schema('alkis');|
2023-02-28 08:39:46.262762  
2023-02-28 08:39:46.264227  Fehler bei Prozeß: 3
2023-02-28 08:39:46.270101  EXITCODE: 3
2023-02-28 08:39:46.272122  Anlegen des Datenbestands schlug fehl.
ewie commented 1 year ago

Danke für den schnellen Fix!