如何在 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 特征定义的过程中检测真正的调用者名称?的主要内容,如果未能解决你的问题,请参考以下文章