运行 MySql 存储过程的最低访问级别

2023-12-01

我正在尝试设置连接到 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 访问权限的简单测试也不起作用。

在不授予太多特权的情况下,我还能做些什么吗?


这似乎是 Connector/NET 中的一个错误,类似于错误 75301但有点不同。当它尝试确定过程的参数元数据时,它首先创建一个MySqlSchemaCollection named Procedures with all有关该过程的元数据。 (这是SELECT * FROM information_schema.routines WHERE 1=1 AND routine_schema LIKE 'Spike' AND routine_name LIKE 'TestAccess'您在日志中看到的查询。)

The Spike用户帐户没有权限读取ROUTINE_DEFINITION列,所以是这样NULL。 Connector/NET 期望该字段为非 NULL 并抛出SqlNullValueException尝试读取它时出现异常。

有两种解决方法:

1)第一个,你已经发现,是设置CheckParameters=False在你的连接字符串中。这将禁用存储过程元数据的检索(避免崩溃),但如果您没有完全正确地获得参数的顺序和类型,则可能会导致调用其他存储过程时出现难以调试的问题。 (Connector/NET 无法再使用元数据为您映射它们。)

2) 切换到没有此错误的不同 ADO.NET MySQL 库:MySql连接器 on NuGet。它与 Connector/NET 高度兼容,执行速度更快,并且修复了很多问题已知的问题.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运行 MySql 存储过程的最低访问级别 的相关文章

随机推荐

  • 如果字符超过一定限制,如何修剪元素的内容并添加“...”?

    我想修剪一部分 td 如果太长 这将确保桌子不会弄乱 下表中的所有数据均从数据库中检索 在 主题 部分 如果文本超过一定的字符限制 如何缩短文本并添加 这是该表的屏幕截图 正如您所看到的 如果主题太长 可能会弄乱表格 是否有任何 jQuer
  • 自定义寻呼机模板

    默认分页器机制在最后一行插入一个表格 然后该表格包含一行 其中包含所需数量的包含页码的单元格 我将页面模式设置为数字 我不想创建一个嵌套表格 而是创建一个由小方形 div 组成的分页模板 这些小方形 div 浮动在彼此的左侧 每个框中都有页
  • Swift 3 核心数据删除对象

    不幸的是 新的核心数据语义让我发疯 我之前的问题有一个干净的代码 但由于头文件的自动生成不正确而无法工作 现在我继续删除对象的工作 我的代码看起来很简单 func deleteProfile withID Int let fetchRequ
  • 不区分大小写的搜索并用 sed 替换

    我正在尝试使用 SED 从日志文件中提取文本 我可以毫不费力地进行搜索和替换 sed s foo bar mylog txt 但是 我想让搜索不区分大小写 从我用谷歌搜索到的内容来看 它看起来像是附加i到命令结束应该有效 sed s foo
  • 拆分包含音频的 CMSampleBufferRef

    我在录制时将录音分成不同的文件 问题是 captureOutput 视频和音频样本缓冲区不对应 1 1 这是合乎逻辑的 void captureOutput AVCaptureOutput captureOutput didOutputSa
  • 如何在div悬停时隐藏视频?

    我试图在 div 悬停时隐藏视频 但我似乎无法使其工作 目前 live video 类位于顶部 eat video 位于下方 我想在悬停 video hover 类时隐藏 live video 的显示 我想要实现的是 2 个全屏视频堆叠在一
  • 解析不同的日期格式:正则表达式

    重新发布这个问题并附上具体细节 因为最后一个问题已被标记下来 我正在努力从档案卡中解析混乱的 tesseract ocr 以获取至少 50 的信息 date1 数据行包含不同形式的日期 如下面的数据示例所示 Raw Text 1 15957
  • 使用 .bat 文件从 .xls 文件读取值

    我只是想知道是否有任何方法可以使用 bat 文件从 xls 文件中读取值 例如 如果我有一个名为 test xls 的 xls 它有两列 即 EID 然后是 邮件 ID 现在 当我们向 xls 输入 EID 名称时 它应该提取与 EID 相
  • 文本框的数据绑定

    我有一个存储 Fruit 类型的对象的基本属性 Fruit food public Fruit Food get return this food set this food value this RefreshDataBindings p
  • 尝试运行“ionic cordova run --emulator”时,在 com.android.prefs.AndroidLocation.getAvdFolder() 上出现 NoSuchMethodError 异常

    我刚刚升级了我的 cordova 和 ionic npm update g cordova ionic 现在当我运行 ionic cordova run emulator 时 我收到以下错误消息 线程 main 中出现异常 java lan
  • 使用jquery从html页面中删除样式标签

    有什么办法可以删除
  • Python unicode popen 或 Popen 读取 unicode 时出错

    我有一个程序可以生成以下输出 10 day weather forecast Tonight Sep 27 Clear 54 0 Tue Sep 28 Sunny 85 61 0 Wed Sep 29 Sunny 86 62 0 Thu S
  • OrderedDict vs defaultdict vs dict [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在 python 的库中 我们现在有两个字典的 Python 实现 它们是子类dict超越本地人dict type Python 的拥护者一直更喜欢defaultdict过度使用dict
  • 我应该清理托管 CMS 的 HTML 标记吗?

    我正在考虑为客户启动类似 CMS 的托管服务 事实上 它将要求客户输入文本 该文本将提供给任何访问其网站的人 我计划使用 Markdown 可能与 WMD SO 使用的实时 Markdown 预览 结合使用来处理大文本块 现在 我应该清理他
  • 我想做以下事情 但它在语义上正确吗
  • ASP.NET MVC 中的异步 GET/POST 和操作名称冲突

    为 ASP NET MVC 创建编辑页面的推荐方法是在名为 Edit 的控制器上使用两种方法 一种 GET 操作和一种 POST 操作 两者共享相同的名称 但重载方式不同 如果编辑失败 则 POST 操作上会显示验证错误 然后 即使 URL
  • Git克隆ssh,用户名、路径和不同驱动器中带有空格

    我有 3 台 Windows 7 Professional 机器 两台被设置为安装了 Git 的开发机器 一台台式机和一台笔记本电脑 第三个是设置为安装了 Git 的文件服务器 并且它还作为 ssh 服务器运行 我一直在提到 YouTube
  • 如果脚本需要输入或输入密码,则失败

    我正在开发一个不需要与用户交互的脚本 如果我的脚本中的程序需要用户输入某些内容 则该脚本应该失败并立即退出 我已经关闭了STDIN在我的脚本的顶部 这适用于某些命令 但有些命令期望在另一个文件描述符中输入 通常是要求输入密码的命令 例如gi
  • 如何计算8086 IDIV指令的结果?

    说明 十六进制数字 mov ax 0832 mov cx 008a idiv cl 文档说 when operand is a byte AL AX operand AH remainder modulus Source http www
  • 运行 MySql 存储过程的最低访问级别

    我正在尝试设置连接到 MySQL 数据库 8 0 的 NET 4 7 1 程序以使用最低权限运行 NET 程序使用 MySql Data 进行连接 用户执行存储过程的最低权限通常仅为EXECUTE特权 这在 MySQL 工作台或命令行中工作