Skip to content

【BcMcp】マイグレーションがテーブルプレフィックスを反映せず oauth2_* が作られる #4529

Description

@kaburk

概要

BcMcp のマイグレーションだけ BcMigration ではなく BaseMigration を継承しているため、テーブルプレフィックスが反映されません。

プレフィックスに mysite_ を設定した環境では、他のプラグインが mysite_seo_metas のようになるのに対し、BcMcp だけ oauth2_access_tokens のように無印で作られます。

baserCMS version : 5.4.0

原因

BaserCore\Database\Migration\BcMigration は table() を上書きして
接続設定のプレフィックスを付けています。

public function table(string $tableName, array $options = []): Table
{
    $prefix = $this->getAdapter()->getConnection()->config()['prefix'] ?? '';
    return parent::table($prefix . $tableName, $options);
}

コアプラグインのマイグレーションの継承元を数えると、BcMcp だけが BaseMigration です。

プラグイン BcMigration BaseMigration
bc-blog 8 0
bc-content-link 2 0
bc-custom-content 9 0
bc-editor-template 2 0
bc-favorite 2 0
bc-mail 10 0
bc-mcp 0 4
bc-search-index 2 0
bc-seo 1 0
bc-theme-config 2 0
bc-uploader 4 0
bc-widget-area 2 0

実害

1. バックアップに含まれない

BcDatabaseService::getAppTableList() は
プレフィックス + Inflector::tableize(Create<Table> のファイル名) で候補を作り、
実在するテーブルと突き合わせます。

oauth2_access_tokens は mysite_oauth2_access_tokens と一致しないため一覧から漏れ、
UtilitiesService のバックアップに含まれません。

2. 他ツールがプレフィックス前提で動くと落ちる

プレフィックスの付いていないテーブルが1つでもあると、
「全テーブルにプレフィックスが付いている」ことを前提にしたコードが壊れます。
実例として BcDbMigrator の変換が止まります(別途 issue を立てます)。

[Cake\Database\Exception\DatabaseException] Could not describe columns on
`mysite_oauth2_access_tokens`
Caused by: Base table or view not found: 1146
Table 'baserofficial.mysite_oauth2_access_tokens' doesn't exist

3. 同一DBに複数サイトを置けない

プレフィックスで分ける運用ができません。

再現手順

  1. config/install.php の Datasources.default に 'prefix' => 'mysite_' を設定する
  2. baserCMS をインストールして BcMcp を有効化する
  3. SHOW TABLES を見る
mysite_seo_metas          ← BcSeo(プレフィックスあり)
oauth2_access_tokens      ← BcMcp(プレフィックスなし)
oauth2_auth_codes
oauth2_clients
oauth2_refresh_tokens

TODO

  • plugins/bc-mcp/config/Migrations/*.php の4本を BcMigration 継承に変える
  • 既存環境向けに、無印テーブルがある場合の移行方法を案内する

備考

baserCMS4系→5系移行作業では一旦 RENAME TABLE oauth2_xxx TO mysite_oauth2_xxx と、手動リネームで回避しました。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions