привилегии предоставления DBI perl

#mysql #database #perl

#mysql #База данных #perl

Вопрос:

Пожалуйста, помогите понять, что я здесь делаю не так. Я предполагаю, что экранирование неверно, но я не могу найти работоспособный пример в Google.

 my $host = "localhost";
my $port = "3306";
my $user = "root";
my $pass = "111";
my $db_name = "test";
my $db_user = "test";
my $db_pass = "test";

my $dsn = "dbi:mysql::$host:$port";
my $dbh = DBI->connect($dsn, $user, $pass) or die "Unable to connect: $DBI::errstrn";

$dbh->do("CREATE DATABASE $db_name");
$dbh->do("CREATE USER $db_user@$host");
$dbh->do("GRANT ALL ON $db_name.* TO $db_user@$host IDENTIFIED BY $db_pass");

$dbh->disconnect();
 

Ошибка:

 DBD::mysql::db do failed: Operation CREATE USER failed for 'test'@'localhost' at /home/andrew/sandbox/script.pl line 42.
DBD::mysql::db do failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'test' at line 1 at /home/andrew/sandbox/script.pl line 43.
 

Спасибо за ответы.

Ответ №1:

Вам нужно указать пароль.

 $dbh->do("GRANT ALL ON $db_name.* TO $db_user@$host IDENTIFIED BY '$db_pass'");
                                                                   ^        ^
 

Хотя, конечно, подготовленные операторы / параметры были бы намного лучше (если MySQL разрешает их здесь, в чем я не уверен на 100%).

Вы $db_user $host также должны указать и (опять же, предполагая, что параметры не работают).

Если параметры работают:

 $dbh->do(q{GRANT ALL ON ?.* TO ?@? IDENTIFIED BY ?}, {}, $db_name, $db_user, $host, $db_pass);
 

Я вполне уверен, что параметры будут работать с паролем, а также, вероятно, с пользователем и хостом. Имя базы данных, я не так уверен. Возможно, вам просто придется встроить его quote_identifier .

редактировать: вы должны просто CREATE USER полностью вычеркнуть строку. Предоставление разрешений создаст пользователя (и с паролем).

Комментарии:

1. извините, я вас не понял, $password содержит простую строку без пробелов, а ошибка указывает на команды «создать пользователя» и «предоставить»

2. @lush: синтаксис ПРЕДОСТАВЛЕНИЯ требует одинарных кавычек вокруг пароля. У вас их нет. Итак, вы получаете синтаксическую ошибку.

3. Это сработало. Да, цитирование не работает с пользователем, но я просто прокомментировал строку «создать пользователя», поскольку это не обязательно. Спасибо)

Ответ №2:

Похоже, вы пытаетесь создать пользователя каждый раз при запуске скрипта — я получаю точную ошибку, если пытаюсь создать пользователя более одного раза.

Комментарии:

1. Вы правы! Я удалил пользователя и указал его как ‘$ db_user’ @ ‘$ host’, теперь он полностью работает. Спасибо)