#php #mysql #yii2 #migration
Вопрос:
Моя проблема связана с автоматическим созданием таблицы migration
истории при первом выполнении yii migrate/up --interactive=0
.
Я смог переопределить учетные данные доступа к базе данных для самих миграций. (см. пример ниже)
Для моего веб-приложения у меня есть пользователь default
, у которого есть следующие GRANT
s: SELECT, INSERT
Для миграции я хочу использовать своего admin
пользователя, у которого есть дополнительные GRANT
s для DDL
.
При выполнении миграции Yii2
требуется создать migration
таблицу с default
пользователем, что приводит к permission denied
ошибке.
Как я могу настроить пользователя базы данных для создания migration
таблицы?
Мой сценарий миграции:
<?php
use yiidbMigration;
/**
* Handles adding columns to table `{{%Tablename}}`.
*/
class m210907_145507_add_json_column_to_Tablename_table extends Migration
{
public function init()
{
$this->db = new yiidbConnection([
'dsn' => 'mysql:host=mysql;dbname=dbname',
'username' => 'admin',
'password' => 'itasecrettoeverybody',
'charset' => 'utf8',
'enableSchemaCache' => true,
'schemaCacheDuration' => 60,
'schemaCache' => 'cache',
]);
parent::init();
}
/**
* {@inheritdoc}
*/
public function safeUp()
{
$this->addColumn('{{%Tablename}}', 'json', $this->json());
}
/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->dropColumn('{{%Tablename}}', 'json');
}
}
Ошибка:
Yii Migration Tool (based on Yii v2.0.43)
Creating migration history table "migration"...
Exception 'yiidbException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1142 CREATE command denied to user 'default'@'172.27.0.4' for table 'migration'
The SQL being executed was: CREATE TABLE `migration` (
`version` varchar(180) NOT NULL PRIMARY KEY,
`apply_time` int(11)
)'
in /app/vendor/yiisoft/yii2/db/Schema.php:678
Error Info:
Array
(
[0] => 42000
[1] => 1142
[2] => CREATE command denied to user 'default'@'172.27.0.4' for table 'migration'
)
Caused by: Exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1142 CREATE command denied to user 'default'@'172.27.0.4' for table 'migration''
in /app/vendor/yiisoft/yii2/db/Command.php:1302
Stack trace:
#0 /app/vendor/yiisoft/yii2/db/Command.php(1302): PDOStatement->execute()
#1 /app/vendor/yiisoft/yii2/db/Command.php(1102): yiidbCommand->internalExecute()
#2 /app/vendor/yiisoft/yii2/console/controllers/MigrateController.php(273): yiidbCommand->execute()
#3 /app/vendor/yiisoft/yii2/console/controllers/MigrateController.php(212): yiiconsolecontrollersMigrateController->createMigrationHistoryTable()
#4 /app/vendor/yiisoft/yii2/console/controllers/BaseMigrateController.php(908): yiiconsolecontrollersMigrateController->getMigrationHistory()
#5 /app/vendor/yiisoft/yii2/console/controllers/BaseMigrateController.php(183): yiiconsolecontrollersBaseMigrateController->getNewMigrations()
#6 [internal function]: yiiconsolecontrollersBaseMigrateController->actionUp()
#7 /app/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array()
#8 /app/vendor/yiisoft/yii2/base/Controller.php(181): yiibaseInlineAction->runWithParams()
#9 /app/vendor/yiisoft/yii2/console/Controller.php(184): yiibaseController->runAction()
#10 /app/vendor/yiisoft/yii2/base/Module.php(534): yiiconsoleController->runAction()
#11 /app/vendor/yiisoft/yii2/console/Application.php(181): yiibaseModule->runAction()
#12 /app/vendor/yiisoft/yii2/console/Application.php(148): yiiconsoleApplication->runAction()
#13 /app/vendor/yiisoft/yii2/base/Application.php(392): yiiconsoleApplication->handleRequest()
#14 /app/yii(20): yiibaseApplication->run()
#15 {main}
Комментарии:
1. Дважды проверьте привилегии, проблема с пользователем БД, я думаю
2. @InsaneSkull как указано в сообщении, моя проблема связана с невозможностью переключиться на пользователя с правильными разрешениями при выполнении сценария. таким образом, права доступа являются правильными, только выбор пользователя в этом
yii migrate/up --interactive=0
случае является проблемой, когда нет существующейmigration
таблицы.
Ответ №1:
Миграции выполняются из консоли.
Это означает, console.php
что файл конфигурации загружается вместо вашей main.php
конфигурации. Таким образом, одним из способов, который также повлиял бы на любые другие консольные команды, которые у вас могут быть, было бы изменение db
конфигурации в components
разделе console
конфигурации.
configconsole.php
:
<?php
$config = [
// ...
'components' => [
'cache' => [
'class' => 'yiicachingFileCache',
],
'log' => [
'targets' => [
[
'class' => 'yiilogFileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => [], // PLACE HERE CUSTOM ADMIN CREDENTIALS
// ...
],
];
Теперь ваши миграции будут выполняться с учетными данными, определенными в конфигурации консоли.
Если случайно у вас есть другие консольные команды, которые изменяют данные в базе данных, и вы не хотите также изменять их пользователя, вы можете добавить другой компонент базы данных и назвать его «DBAdmin» с учетными данными администратора.
<?php
$config = [
// ...
'components' => [
'cache' => [
'class' => 'yiicachingFileCache',
],
'log' => [
'targets' => [
[
'class' => 'yiilogFileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => [], // REGULAR DB connection
'dbAdmin' => [], // PLACE HERE CUSTOM ADMIN CREDENTIALS
// ...
],
];
А затем проверьте:
https://www.yiiframework.com/doc/guide/2.0/en/db-migrations#using-command-line-options
Чтобы указать, какое соединение с БД следует использовать при выполнении миграции.
yii migrate --db=dbAdmin