Estamos utilizando la versión Postgres 13.0 con el archivo Spring-Boot .sql como paso inicial.
Necesito ejecutar un script de ACTUALIZACIÓN, pero solo si la tabla en sí ya existe.
Después de un poco de esfuerzo para entender cuál es la sintaxis correcta, llegué con el siguiente script:
ALTER TABLE IF EXISTS ONLY scm_repos ADD COLUMN IF NOT EXISTS token_id BIGINT; DO ' BEGIN IF EXISTS (SELECT 1 FROM scm_repos WHERE id = 1) THEN UPDATE scm_repos repos SET token_id=(SELECT token_id FROM scm_orgs orgs WHERE repos.org_id=orgs.id); END IF ; END; ' ;
Mi intención es simple: ejecutar el script ACTUALIZAR solo si la tabla scm_repos
existe, pero independientemente de lo que intenté, sigo recibiendo el siguiente error:
Failed to execute SQL script statement #5 of URL [jar:file:/app/cx-integrations-datastore.jar!/BOOT-INF/classes!/schema.sql]: DO ' BEGIN IF EXISTS (SELECT 1 FROM scm_repos WHERE id = 1) THEN UPDATE scm_repos repos SET token_id=(SELECT token_id FROM scm_orgs orgs WHERE repos.org_id=orgs.id); END IF ; END; ' ; nested exception is org.********ql.util.PSQLException: ERROR: relation "scm_repos" does not exist Where: PL/pgSQL function inline_code_block line 3 at IF
¿Que me estoy perdiendo aqui?
13.0 tiene errores no corregidos conocidos. 13.4 es la última versión de 13. Casi nunca hay una buena razón para ejecutar una versión de lanzamiento menor anterior. No es que eso parezca ser relevante aquí.
Pero lo que te estás perdiendo aquí es que en el nivel superior, EXISTS verifica si SELECCIONAR devuelve alguna fila. No verifica si las tablas mencionadas en la lista FROM de SELECT existen o no, asume que sí.
Puede cambiar su consulta para que consulte el catálogo para ver si existe la tabla, algo como:
IF EXISTS (SELECT 1 FROM pg_class where relname=$J$scm_repos$J$) ...