Yii2 устанавливает пользователя MySQL для создания таблицы миграции в первый раз?

#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