Unexpected error running liquibase error no schema has been selected to create in

This happens when not having USAGE privilege on any of the schemas of search_path. By default the pseudo-role public (all users) has this privilege on the publi

This happens when not having USAGE privilege on any of the schemas of search_path. By default the pseudo-role public (all users) has this privilege on the publicschema, so this error happens only after revoking it explicitly with:

revoke usage on schema public from public;

This is required when it’s not desirable that people peek into other people schemas, even without selecting data from tables (which is granted through different privileges).

If this REVOKE hasn’t been done in that database, it may have happened in the template database by which new databases are modelled (see CREATE DATABASE).


When a user has USAGE privilege, but lacks CREATE privilege on the schema, it’s a different error when trying to create an object: permission denied for schema public.

To check the privileges inside psql, use dn+ public.

By default (shown with extended display x for readability):

# dn+ public
List of schemas
-[ RECORD 1 ]-----+-----------------------
Name              | public
Owner             | postgres
Access privileges | postgres=UC/postgres
                  | =UC/postgres
Description       | standard public schema

lack of a rolename before = means it’s for all roles (=public)

Without public USAGE privilege

Name              | public
Owner             | postgres
Access privileges | postgres=UC/postgres
                  | =C/postgres
Description       | standard public schema

Without public USAGE or CREATE privileges

Name              | public
Owner             | postgres
Access privileges | postgres=UC/postgres
Description       | standard public schema

I had pgdump file with creating functions in custom schema and I wanted to switch custom schema name to general public and replaced all occurences with old schema to empty (e.g. myschema.tablename to tablename)
And started to receive error

ERROR:  no schema has been selected to create in

For my case error happens when at the beginning of dump present line

SELECT pg_catalog.set_config('search_path', '', false);

I have changed second arg to «public»

SELECT pg_catalog.set_config('search_path', 'public', false);

And problem gone

I’ve tried multiple solutions, and keep getting the same error over and over.

Worse to mention, the error appears to me when I needed to restart migration of my DB by deleting public schema and after creating it again.

The fix was:

grant usage on schema public to public;
grant create on schema public to public;

I am working on a DR backup + restore script to get our BB instance up and running. 

we are using Postgres 

I am backing up my BB db using 

pg_dump bitbucket > bitbucket.dump

restoring it 

pg_restore -v -c -d bitbucket bitbucket.dump

no errors during restore 

Starting BB, it tries to create a table databasechangeloglock  (its already there)

I gave the ‘atlbitbucket’ user all privileges on teh DB, no idea how to get it to start correctly

Caused by: liquibase.exception.LockException: liquibase.exception.DatabaseException: ERROR: no schema has been selected to create in
Position: 14 [Failed SQL: CREATE TABLE databasechangeloglock (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP WITHOUT TIME ZONE, LOCKEDBY VARCHAR(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID))]
at liquibase.lockservice.StandardLockService.acquireLock(StandardLockService.java:242)
at liquibase.lockservice.StandardLockService.waitForLock(StandardLockService.java:170)
at liquibase.Liquibase.update(Liquibase.java:196)
at liquibase.Liquibase.update(Liquibase.java:192)
at liquibase.integration.spring.SpringLiquibase.performUpdate(SpringLiquibase.java:431)
at liquibase.database.ExtendedSpringLiquibase.afterPropertiesSet(ExtendedSpringLiquibase.java:32)
… 5 common frames omitted
Caused by: liquibase.exception.DatabaseException: ERROR: no schema has been selected to create in
Position: 14 [Failed SQL: CREATE TABLE databasechangeloglock (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP WITHOUT TIME ZONE, LOCKEDBY VARCHAR(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID))]
at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:309)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:55)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:113)
at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:103)
at liquibase.lockservice.StandardLockService.init(StandardLockService.java:94)
at liquibase.lockservice.StandardLockService.acquireLock(StandardLockService.java:206)
… 10 common frames omitted

This is what the DB looks like (attached img)cap.GIF

У меня есть отдельное приложение. Это на java, spring -boot, postgres и имеет Liquibase.

Мне нужно развернуть мое приложение, и Likibase должна создать все таблицы и т. Д. Но она должна делать это в пользовательской схеме, а не в публичном доступе. Все служебные таблицы Liquibase (databasechangelog и databasechangeloglock) также должны быть в настраиваемой схеме. Как я могу создать свою схему в БД до того, как Liquibase начнет работать? Я должен делать это внутри своего приложения при его развертывании, в конфигурации или в чем-то подобном. Без какого-либо ручного вмешательства в БД.

Application.properties:

spring.datasource.jndi-name=java:/PostgresDS
spring.jpa.properties.hibernate.default_schema=my_schema
spring.jpa.show-sql = false
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.datasource.continue-on-error=true
spring.datasource.sql-script-encoding=UTF-8

liquibase.change-log = classpath:liquibase/changelog-master.yaml
liquibase.default-schema = my_schema

UPD :

При запуске Likibase создается две таблицы databasechangelogs и еще одна таблица. После этого начинает работать ликвибаза. Но я хочу, чтобы Liquibase была в liquibase.default-schema = my_schema, но она не существует, когда Liquibase начинает работать, и это ошибка: исключение является liquibase.exception.LockException: liquibase.exception.DatabaseException: ERROR: schema «my_schema» не существует

Я хочу, чтобы Liquibase работала в настраиваемой схеме, а не публично:

liquibase.default-schema = my_schema

Но прежде, чем Liquibase сможет это сделать, необходимо создать схему. Liquibase не может этого сделать, потому что он еще не запущен и для запуска ему нужна схема. Замкнутый круг.

2 ответа

Лучший ответ

Я нашел решение с моим application.properties.

org.springframework.jdbc.datasource.init.ScriptUtils работал до Liquibase.

Журналы :

14:11:14,760 INFO  [org.springframework.jdbc.datasource.init.ScriptUtils] 
(ServerService Thread Pool -- 300) Executing SQL script from URL 
[vfs:/content/app.war/WEB-INF/classes/schema.sql]

14:11:14,761 INFO  [org.springframework.jdbc.datasource.init.ScriptUtils] 
(ServerService Thread Pool -- 300) Executed SQL script from URL 
[vfs:/content/app.war/WEB-INF/classes/schema.sql] in 1 ms.

14:11:14,912 ERROR [stderr] (ServerService Thread Pool -- 300) INFO 9/27/18 
2:11 PM: liquibase: Successfully acquired change log lock

14:11:15,292 ERROR [stderr] (ServerService Thread Pool -- 300) INFO 9/27/18 
2:11 PM: liquibase: Reading from my_schema.databasechangelog

14:11:15,320 ERROR [stderr] (ServerService Thread Pool -- 300) INFO 9/27/18 
2:11 PM: liquibase: Successfully released change log lock

Я просто поместил schema.sql с CREATE SCHEMA IF NOT EXISTS my_schema; в каталог ресурсов, и все работает правильно.

Спасибо всем за помощь.

Обновление : работает для Spring boot 1.X. Если вы используете Spring Boot 2, вы должны включить schema.sql в файле свойств с помощью spring.datasource.initialization-mode=always. Дополнительная информация в Spring Boot — загрузка исходных данных


5

G.O.
5 Фев 2019 в 13:03

Spring необходимо создать схему перед инициализацией конфигурации Liquibase. Для этого,

A) Создайте сценарий инициализации schema.sql и поместите его в папку /resources.

CREATE SCHEMA IF NOT EXISTS <schema_name>;

schema.sql

Б) Добавьте указанное ниже свойство в application.properties

spring.datasource.initialization-mode=always

< Сильный > Выход

Это гарантирует, что таблицы журнала изменений Liquibase будут созданы по вашей схеме, а не по общедоступной схеме.

output

Полную версию статьи см .: Liquibase: Create схема, таблицы, элементы в вашей базе данных


1

Arjun
11 Фев 2020 в 18:38

Понравилась статья? Поделить с друзьями:
  • Underverse error sans vs ink sans
  • Underverse error sans theme 1 hour
  • Underverse error sans sprite
  • Undertale как изменить разрешение экрана
  • Undertale как изменить имя