【发布时间】:2018-11-16 15:30:28
【问题描述】:
我正在尝试设置连接到 MySQL 数据库 8.0 的 .NET 4.7.1 程序以使用最低权限运行。 .NET 程序使用 MySql.Data 进行连接。用户执行存储过程的最低权限通常只有 EXECUTE 权限。这适用于 MySQL 工作台或命令行。
在运行 .NET 程序时,它会返回以下异常: System.Data.SqlTypes.SqlNullValueException:'数据为空。不能对 Null 值调用此方法或属性。'
为方便起见,我创建了一个非常小的演示程序来演示该问题。
数据库设置:
CREATE DATABASE Spike;
CREATE PROCEDURE TestAccess()
BEGIN
END;
CREATE USER Spike@localhost IDENTIFIED WITH mysql_native_password BY 'sample';
GRANT EXECUTE ON PROCEDURE `TestAccess` TO Spike@localhost;
设置程序代码:
static void Main(string[] args)
{
using (MySqlConnection conn = new MySqlConnection("Server=localhost;Database=Spike;uid=Spike;pwd=sample"))
{
conn.Open();
Console.WriteLine("Connection open");
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.CommandText = "TestAccess";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
Console.WriteLine("Query executed");
}
Console.ReadKey();
}
崩溃发生在cmd.ExecuteNonQuery(); 行
崩溃的堆栈很有趣,因为它似乎表明正在查询 information_schema。记录所有语句时,我可以看到异常之前的最后一条语句是:
SELECT * FROM information_schema.routines WHERE 1=1 AND routine_schema LIKE 'Spike' AND routine_name LIKE 'TestAccess'
我不能在 information_schema 上授予不同的权限,但我可以在存储过程上授予更多权限以使更多信息在例程表中可见,但这感觉不对。授予 CREATE 和 ALTER 访问权限的简单测试也不起作用。
在不授予太多特权的情况下,我还能做些什么吗?
【问题讨论】:
-
经过进一步调查,在这种情况下似乎只有 ROUTINE_DEFINITION 列为空,而当使用 root 查看 information_schema 时,此列被填充。