PG::DependentObjectsStillExist: ОШИБКА: невозможно удалить функцию delete_user_password(), так как на неё зависят другие объекты
Похоже, проблема возникает здесь:
PG::DependentObjectsStillExist: ОШИБКА: невозможно удалить функцию delete_user_password(), так как на неё зависят другие объекты
Похоже, проблема возникает здесь:
Это пост-миграция:
== 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 и попытался запустить миграции из другого терминала так:
rake db:ensure_post_migrations db:migrate
Затем я сделал что-то вроде этого:
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
И, возможно, ещё несколько других действий, и в итоге миграция завершилась успешно.
Надеюсь, завтра смогу повторить это с новой базой данных…
У вас есть таблицы в схеме backup (используемой во время резервного копирования/восстановления), которые зависят от этой функции.
Устарела ли здесь схема backup? Если да, то вам, вероятно, нужно только выполнить DROP SCHEMA backup, чтобы избавиться от неё.
Огромное спасибо! Звучит правильно, но когда я делаю это, у меня появляется что-то вроде ![]()
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, как и было сказано:
DROP SCHEMA backup CASCADE;
Думаю, это решило проблему! Пройдёт 25 минут, прежде чем я узнаю результат, и к тому времени, надеюсь, я уже перестану смотреть в компьютер.
Я отпишусь завтра.
Спасибо ещё раз.
Именно это и было. Я на 99% уверен, что остановил восстановление с помощью Ctrl+C по какой-то причине (например, это занимает 25 минут), и из-за этого осталась устаревшая схема. Не могу поверить, что за последнее десятилетие мне так и не удалось этого узнать, но таковы факты!
Большое спасибо.