如何在 MySQL 中使用 SQL SECURITY DEFINER 特征定义的过程中检测真正的调用者名称?

Posted

技术标签:

【中文标题】如何在 MySQL 中使用 SQL SECURITY DEFINER 特征定义的过程中检测真正的调用者名称?【英文标题】:How to detect real invoker's name in procedure defined with SQL SECURITY DEFINER characteristic in MySQL? 【发布时间】:2016-01-20 18:12:42 【问题描述】:

简单来说,我有一个 mysql 过程 get_data(),它为用户选择过滤数据。自定义过滤条件存储在数据库表中。过程get_data() 应该获取当前用户的条件并通过添加WHERE 子句仅选择他的数据。

但是当我使用SQL SECURITY DEFINER 特征定义过程时,无法检测过程主体中的当前用户(调用者),因为函数current_user() 返回定义者的名称,当我使用SQL SECURITY INVOKER 特征定义过程时,过程失败,因为调用者在源表上没有SELECT 权限。

是否可以在 MySQL 中创建一个过程,从用户无法访问的表中为用户选择自定义数据?

目前,我已经定义了视图(每个用户一个),但是在查询条件不断变化的情况下维护它是很困难的。

【问题讨论】:

【参考方案1】:

您是否尝试过使用 user() 而不是 current_user()?

【讨论】:

是的。在我的例子中,user() 返回 'user1@localhost' 而 current_user() 返回 'user1@%'。可能解决方案没那么简单。 您为调用该程序的用户使用的登录名是什么?您如何登录?您用于创建程序的登录名是什么?

以上是关于如何在 MySQL 中使用 SQL SECURITY DEFINER 特征定义的过程中检测真正的调用者名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中使用命令行导入 SQL 文件?

如何在 MySQL 中使用命令行导入 SQL 文件?

如何在 MySQL 中使用命令行导入 SQL 文件?

如何在 Ubuntu 上的 mysql 中运行 sql 脚本?

如何在mysql shell命令中执行sql命令行

如何使用 ORDER BY 在 SQL/MySQL 中查找行