【问题标题】:perl DBI grant privilegesperl DBI 授予权限
【发布时间】:2011-10-31 17:53:00
【问题描述】:

请帮助理解我在这里做错了什么。我猜转义是错误的,但我无法谷歌搜索一个可行的例子。

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::errstr\n";

$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.

感谢您的回答。

【问题讨论】:

    标签: mysql database perl


    【解决方案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 行。授予权限将创建用户(并使用密码)。

    【讨论】:

    • 对不起,我没听明白,$password 包含一个没有空格的简单字符串,错误指向“创建用户”和“授予”命令
    • @lush:GRANT syntax 需要在密码周围加上单引号。你没有它们。所以你得到一个语法错误。
    • 成功了。是的,引用不适用于用户,但我只是评论了“创建用户”字符串,因为它不是强制性的。谢谢)
    【解决方案2】:

    看起来您每次运行脚本时都在尝试创建用户 - 如果我尝试多次创建用户,我会收到确切的错误。

    【讨论】:

    • 你是对的!我删除了用户并将其引用为 '$db_user'\@'$host',现在它可以正常工作了。谢谢)
    猜你喜欢
    • 2016-08-24
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2022-08-24
    相关资源
    最近更新 更多