【问题标题】:Check if database exists while trying to grant permissions在尝试授予权限时检查数据库是否存在
【发布时间】:2013-04-16 13:48:12
【问题描述】:

我正在尝试在 perl 脚本中构建一些函数来创建、删除和授予对 mysql 数据库的权限。

目前,我尝试为用户授予指定数据库的权限,如下所示:

use DBI;
my $dbname=$_[1];
my $dbh = DBI->connect("dbi:mysql:", $sqluser,$sqlpass) or die "Unable to connect: $DBI::errstr\n";
.....
my $username=@unp[0];
my $dbname=@unp[1];         
my $db_com="GRANT ALL ON ".$dbname.".* TO '".$username."'\@'localhost'";
my $sth = $dbh->prepare($db_com);
$sth->execute 
or die "SQL Error: $DBI::errstr\n";
print "Permissions granted\n";  

如果用户存在,则此方法有效。

在为 CREATE USER 和 DROP USER 尝试类似代码时,它可以有效地工作,根据请求创建或删除它们,或者如果用户不存在则抛出 mysql 语法错误。但是在授予权限时,即使数据库不存在,命令也会执行,这让我感到沮丧。

其实在mysql提示符下,如果执行了sql查询,就会返回:

Query OK, 0 rows affected (0.00 sec)

我需要一种方法来发现数据库是否不存在,并提示用户提供正确的数据库名称。

【问题讨论】:

  • 我已经添加了几行来解释我在做什么。我想使用 perl DBD::mysql 驱动程序来执行此操作。
  • @Axeman,我做到了。但是 CREATE DATABASE 在我的脚本中很好。如果数据库存在,则返回错误。但 GRANT 不会,即使数据库不存在。
  • @Droidzone,你看到上面的 SELECT 语句了吗?如果您问我,创建一个空数据库以使权限正确是有点落后。

标签: mysql perl


【解决方案1】:

首先将show databases 作为查询,并在执行 GRANT 之前在其中查找名称

在不存在的数据库上授予权限是完全可以接受的,所发生的只是mysql 数据库中的表正在被写入

【讨论】:

  • 确实,这似乎是mysql做事的方式。即使数据库确实存在,GRANT 和 REVOKE 似乎总是返回 0 行受影响。
猜你喜欢
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 2014-08-16
  • 2021-02-01
相关资源
最近更新 更多