norBIT/alkisimport

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

Closed this issue · 1 comments

ewie commented

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:

BEGIN
EXECUTE 'CREATE SCHEMA ' || quote_ident(t);
RAISE NOTICE 'Schema % angelegt.', t;
EXCEPTION WHEN duplicate_schema OR unique_violation THEN
-- skip
END;

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:

alkisimport/alkis-import.sh

Lines 557 to 561 in e393be3

n=$(psql -X -t -c "SELECT count(*) FROM pg_catalog.pg_namespace WHERE nspname='${SCHEMA//\'/\'\'}'" "$DB")
n=${n//[ ]}
if [ $n -eq 0 ]; then
psql -X -q -c "CREATE SCHEMA \"${SCHEMA//\"/\"\"}\"" "$DB"
fi

alkisimport/alkisImport.py

Lines 667 to 675 in e393be3

qry = self.db.exec_("SELECT 1 FROM pg_namespace WHERE nspname='{}'".format(self.schema.replace("'", "''")))
if not qry:
self.log("Konnte Schema nicht überprüfen! [{}]".format(qry.lastError().text()))
return None
if not qry.next():
if not self.db.exec_("CREATE SCHEMA \"{}\"".format(self.schema.replace('"', '""'))):
self.log("Konnte Schema nicht erstellen!")
return None

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

Danke für den schnellen Fix!