1. 什么是definer?
在MySQL中,每个存储过程、函数、视图都有一个definer。definer的作用就是标识这个对象是谁创建的,也就是说这个对象使用什么权限创建。
2. 如何查询现有对象的definer?
查询现有对象的definer使用以下命令:
SHOW CREATE {PROCEDURE|FUNCTION|VIEW} object_name;
2.1 查看存储过程的definer
查询存储一个过程的definer使用以下命令:
SHOW CREATE PROCEDURE procedure_name;
2.2 查看函数的definer
查询一个函数的definer使用以下命令:
SHOW CREATE FUNCTION function_name;
2.3 查看视图的definer
查询一个视图的definer使用以下命令:
SHOW CREATE VIEW view_name;
3. 如何修改现有对象的definer?
修改现有对象的definer需要ALTER权限。使用以下命令来修改对象的definer:
ALTER {PROCEDURE|FUNCTION|VIEW} object_name SQL SECURITY DEFINER;
这个命令将definer修改为当前用户,也就是说,当以这个对象的definer执行代码时,使用的是当前用户的权限。
4. 如何确保修改后的对象definer生效?
修改完对象的definer,需要使用以下命令来更新:
FLUSH PRIVILEGES;
这个命令会刷新权限表。
5. 一个案例
假设我们有一个存储过程,现在我们需要修改这个存储过程的definer为当前用户。我们可以使用以下命令来完成:
SHOW CREATE PROCEDURE mydb.myprocedure;
查询当前存储过程的definer。
ALTER PROCEDURE mydb.myprocedure SQL SECURITY DEFINER;
将存储过程的definer修改为当前用户。
FLUSH PRIVILEGES;
刷新权限表,让修改生效。
6. 总结
修改MySQL对象的definer比较简单,使用ALTER命令即可。但是,在修改前一定要查询当前对象的definer,以免将definer修改错误。