私の所属している開発チームでは、現在、自社サービスをRails5に移行中です。先日、ふとDBを見てみると、"ar_internal_metadata" という見慣れないテーブルが存在していることに気がつきました。テーブル情報は以下のようになっています。
ar_internal_metadata
key | value | created_at | updated_at |
---|---|---|---|
environment | development | 2016-08-13 18:42:31 | 2016-08-13 18:42:31 |
environmentの情報を保持しているだけみたいです。
Rails 5で追加された、DB誤爆削除防止機能だった
気になったので調べてみました。どうやら、Rails5から追加された新機能で、DBの不用意な削除を防止するための機能に必要なテーブルみたいです。
具体的には、environmentがproductionの時に、以下のタスクを実行すると例外が発生します(他にもあるかも)。
drop:all
drop
purge:all
purge
>RAILS_ENV=production rails db:drop
rails aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
bin/rails:5:in `require'
bin/rails:5:in `<main>'
Tasks: TOP => db:check_protected_environments
(See full trace by running task with --trace)
タスクを通すためには、警告にある通り、"DISABLE_DATABASE_ENVIRONMENT_CHECK=1" を指定すればOKです。
DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails db:drop
デフォルトではproduction環境でのみ例外が発生しますが、任意に変更することも可能です。例えば、staging環境を含める場合は、"config/application.rb"に以下の記述を追加します。
ActiveRecord::Base.protected_environments = %w(production staging)
また、現在の環境が保護されているか(db:dropで例外が発生するか)を調べるには、以下のタスクを実行すれば明らかになります。
>rails db:check_protected_environments # 保護されている場合は例外が発生する。
テーブル削除誤爆防止機能も欲しいです・・・