LoginSignup
45
37

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-08-14

私の所属している開発チームでは、現在、自社サービスを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 # 保護されている場合は例外が発生する。

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

45
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
37