Ruby
Rails

Rails5でDBに自動生成されるテーブル、"ar_internal_metadata" とは何なのか

私の所属している開発チームでは、現在、自社サービスを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"に以下の記述を追加します。

config/application.rb
ActiveRecord::Base.protected_environments = %w(production staging)

また、現在の環境が保護されているか(db:dropで例外が発生するか)を調べるには、以下のタスクを実行すれば明らかになります。

>rails db:check_protected_environments # 保護されている場合は例外が発生する。

テーブル削除誤爆防止機能も欲しいです・・・