U-NAS系统自带的MYSQL。
用mysql连接上,执行show tables,是能看到user表的。
但是更新密码,就报错。

ERROR 1356 (HY000): View 'mysql.user' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

解决方案:

1. 检查 mysql.user 是否是视图
首先,检查 mysql.user 是否是视图。你可以使用以下命令:

SHOW FULL TABLES IN mysql WHERE TABLE_TYPE = 'VIEW';

2. 查看视图定义
如果 mysql.user 是视图,可以通过以下命令查看视图的定义:

SHOW CREATE VIEW mysql.user;

3. 检查权限
确保你有足够的权限来更新 mysql.user 表。你可以查看当前用户的权限:

SHOW GRANTS FOR CURRENT_USER();

执行了查看视图之后,

返回如下信息:

MariaDB [mysql]> SHOW CREATE VIEW mysql.user\G;
*************************** 1. row ***************************
                View: user
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=mariadb.sys@localhost SQL SECURITY DEFINER VIEW user AS select global_priv.Host AS Host,global_priv.User AS User,if(json_value(global_priv.Priv,'$.plugin') in ('mysql_native_password','mysql_old_password'),ifnull(json_value(global_priv.Priv,'$.authentication_string'),''),'') AS Password,if(json_value(global_priv.Priv,'$.access') & 1,'Y','N') AS Select_priv,if(json_value(global_priv.Priv,'$.access') & 2,'Y','N') AS Insert_priv,if(json_value(global_priv.Priv,'$.access') & .........省略

从视图定义中可以看出,mysql.user 视图基于 global_priv 表并从其中提取数据。因此,要更新 mysql.user 视图中的数据,需要直接更新 global_priv 表。

更新 global_priv 表

根据 mysql.user 视图的定义,authentication_string 存储在 global_priv 表的 Priv 列的 JSON 字段中。你需要使用 JSON 操作来更新它。

USE mysql;

-- 更新密码和插件
UPDATE global_priv 
SET Priv = JSON_SET(Priv, '$.authentication_string', '*E9999.......................EEEEE', '$.plugin', 'mysql_native_password') 
WHERE User='root' AND Host='localhost';

-- 刷新权限
FLUSH PRIVILEGES;

-- 检查更新是否成功
SELECT User, Host, JSON_UNQUOTE(JSON_EXTRACT(Priv, '$.authentication_string')) AS authentication_string, JSON_UNQUOTE(JSON_EXTRACT(Priv, '$.plugin')) AS plugin
FROM global_priv
WHERE User='root' AND Host='localhost';

标签: none

添加新评论