# Проблемы с миграцией из-за остановки восстановления до его завершения

**URL:** https://meta.discourse.org/t/migration-trouble-due-to-stopping-a-restore-before-it-finished/373630
**Category:** Support
**Created:** [09.Июль.2025 19:45:29 UTC](https://meta.discourse.org/t/migration-trouble-due-to-stopping-a-restore-before-it-finished/373630 "2025-07-09T19:45:29Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [09.Июль.2025 19:45:29 UTC](https://meta.discourse.org/t/migration-trouble-due-to-stopping-a-restore-before-it-finished/373630/1 "2025-07-09T19:45:29Z")

</div>

```ruby
PG::DependentObjectsStillExist: ОШИБКА: невозможно удалить функцию delete_user_password(), так как на неё зависят другие объекты

```

Похоже, проблема возникает здесь:

> <https://github.com/discourse/discourse/blob/fe1b1edba7ab3867fd920143bb8f3b9584db5bfb/db/migrate/20240903024211_add_trigger_to_users_to_sync_user_passwords.rb#L42>

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [09.Июль.2025 21:33:41 UTC](https://meta.discourse.org/t/migration-trouble-due-to-stopping-a-restore-before-it-finished/373630/2 "2025-07-09T21:33:41Z")

</div>

Это пост-миграция:

```plaintext

== 20240910090759 MakePasswordColumnsFromUsersReadOnly: migrating =============
-- execute("DROP TRIGGER IF EXISTS users_password_sync_on_delete_password ON users;\n")
   -> 0.0007s
-- execute("DROP FUNCTION IF EXISTS delete_user_password;\n")
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled: (StandardError)

PG::DependentObjectsStillExist: ERROR: cannot drop function delete_user_password() because other objects depend on it
DETAIL: trigger users_password_sync_on_delete_password on table backup.users depends on function delete_user_password()
HINT: Use DROP ... CASCADE to drop the dependent objects too.
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-4.0.0/lib/patches/db/pg/alias_method.rb:109:in `exec'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-4.0.0/lib/patches/db/pg/alias_method.rb:109:in `async_exec'
(eval at /var/www/discourse/lib/method_profiler.rb:38):24:in `async_exec'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:56:in `block (2 levels) in raw_execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:1004:in `block in with_raw_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:976:in `with_raw_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:55:in `block in raw_execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/notifications/instrumenter.rb:58:in `instrument'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:1119:in `log'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:54:in `raw_execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:538:in `internal_execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:137:in `execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/query_cache.rb:27:in `execute'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:48:in `execute'

```

Поэтому я выполнил `restore --pause` и попытался запустить миграции из другого терминала так:

```plaintext
rake db:ensure_post_migrations db:migrate

```

Затем я сделал что-то вроде этого:

```plaintext
ActiveRecord::Base.connection.execute(<<~SQL)
  DROP TRIGGER IF EXISTS users_after_delete_user_passwords ON users;
SQL

ActiveRecord::Base.connection.execute(<<~SQL)
  DROP TRIGGER IF EXISTS users_password_sync_on_delete_password ON users;
SQL

ActiveRecord::Base.connection.execute(<<~SQL)
  DROP TRIGGER IF EXISTS users_password_sync_on_delete_password ON backup.users;
SQL

```

И, возможно, ещё несколько других действий, и в итоге миграция завершилась успешно.

Надеюсь, завтра смогу повторить это с новой базой данных…

---

<div class="post-metadata">

### Author: ![supermathie](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/supermathie/32/507518_2.png) [@supermathie](https://meta.discourse.org/u/supermathie)
#### Post date: [09.Июль.2025 21:37:49 UTC](https://meta.discourse.org/t/migration-trouble-due-to-stopping-a-restore-before-it-finished/373630/3 "2025-07-09T21:37:49Z")

</div>

> [@pfaffman](#):
>
> ```plaintext
> == 20240910090759 MakePasswordColumnsFromUsersReadOnly: migrating =============
> -- DROP TRIGGER IF EXISTS users_password_sync_on_delete_password ON users
> -- DROP FUNCTION IF EXISTS delete_user_password
> 
> DETAIL: trigger users_password_sync_on_delete_password on
> table backup.users depends on function delete_user_password()
> 
> ```

У вас есть таблицы в схеме `backup` (используемой во время резервного копирования/восстановления), которые зависят от этой функции.

Устарела ли здесь схема `backup`? Если да, то вам, вероятно, нужно только выполнить `DROP SCHEMA backup`, чтобы избавиться от неё.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [09.Июль.2025 21:50:01 UTC](https://meta.discourse.org/t/migration-trouble-due-to-stopping-a-restore-before-it-finished/373630/4 "2025-07-09T21:50:01Z")

</div>

Огромное спасибо! Звучит правильно, но когда я делаю это, у меня появляется что-то вроде 🙂

```plaintext
table backup.group_archived_messages depends on schema backup
table backup.incoming_emails depends on schema backup
table backup.user_options depends on schema backup
table backup.email_change_requests depends on schema backup
table backup.given_daily_likes depends on schema backup
table backup.onceoff_logs depends on schema backup
table backup.tags depends on schema backup
table backup.topic_tags depends on schema backup
table backup.tag_users depends on schema backup
table backup.category_tags depends on schema backup
table backup.scheduler_stats depends on schema backup
table backup.tag_groups depends on schema backup

```

База данных была новой и пустой, когда я начинал, поэтому я не понимаю, почему у меня осталась устаревшая резервная копия базы данных.

РЕДАКТИРОВАНИЕ: Я использовал CASCADE, как и было сказано:

```plaintext
DROP SCHEMA backup CASCADE;

```

Думаю, это решило проблему! Пройдёт 25 минут, прежде чем я узнаю результат, и к тому времени, надеюсь, я уже перестану смотреть в компьютер.

Я отпишусь завтра.

Спасибо ещё раз.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [10.Июль.2025 16:21:39 UTC](https://meta.discourse.org/t/migration-trouble-due-to-stopping-a-restore-before-it-finished/373630/5 "2025-07-10T16:21:39Z")

</div>

> [@supermathie](#):
>
> Устарела ли здесь схема `backup`? Если да, то, вероятно, достаточно выполнить `DROP SCHEMA backup`, чтобы удалить её.

Именно это и было. Я на 99% уверен, что остановил восстановление с помощью Ctrl+C по какой-то причине (например, это занимает 25 минут), и из-за этого осталась устаревшая схема. Не могу поверить, что за последнее десятилетие мне так и не удалось этого узнать, но таковы факты!

Большое спасибо.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [09.Август.2025 16:22:38 UTC](https://meta.discourse.org/t/migration-trouble-due-to-stopping-a-restore-before-it-finished/373630/6 "2025-08-09T16:22:38Z")

</div>

Эта тема была автоматически закрыта через 30 дней после последнего ответа. Новые ответы больше не принимаются.
