概要
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に複数サイトを置けない
プレフィックスで分ける運用ができません。
再現手順
config/install.php の Datasources.default に 'prefix' => 'mysite_' を設定する
- baserCMS をインストールして BcMcp を有効化する
SHOW TABLES を見る
mysite_seo_metas ← BcSeo(プレフィックスあり)
oauth2_access_tokens ← BcMcp(プレフィックスなし)
oauth2_auth_codes
oauth2_clients
oauth2_refresh_tokens
TODO
備考
baserCMS4系→5系移行作業では一旦 RENAME TABLE oauth2_xxx TO mysite_oauth2_xxx と、手動リネームで回避しました。
概要
BcMcp のマイグレーションだけ
BcMigrationではなくBaseMigrationを継承しているため、テーブルプレフィックスが反映されません。プレフィックスに
mysite_を設定した環境では、他のプラグインがmysite_seo_metasのようになるのに対し、BcMcp だけoauth2_access_tokensのように無印で作られます。baserCMS version : 5.4.0
原因
BaserCore\Database\Migration\BcMigrationはtable()を上書きして接続設定のプレフィックスを付けています。
コアプラグインのマイグレーションの継承元を数えると、BcMcp だけが
BaseMigrationです。実害
1. バックアップに含まれない
BcDatabaseService::getAppTableList()はプレフィックス + Inflector::tableize(Create<Table> のファイル名)で候補を作り、実在するテーブルと突き合わせます。
oauth2_access_tokensはmysite_oauth2_access_tokensと一致しないため一覧から漏れ、UtilitiesServiceのバックアップに含まれません。2. 他ツールがプレフィックス前提で動くと落ちる
プレフィックスの付いていないテーブルが1つでもあると、
「全テーブルにプレフィックスが付いている」ことを前提にしたコードが壊れます。
実例として BcDbMigrator の変換が止まります(別途 issue を立てます)。
3. 同一DBに複数サイトを置けない
プレフィックスで分ける運用ができません。
再現手順
config/install.phpのDatasources.defaultに'prefix' => 'mysite_'を設定するSHOW TABLESを見るTODO
plugins/bc-mcp/config/Migrations/*.phpの4本をBcMigration継承に変える備考
baserCMS4系→5系移行作業では一旦
RENAME TABLE oauth2_xxx TO mysite_oauth2_xxxと、手動リネームで回避しました。