MySQL 中的 DEFINER 是一个关键的概念,尤其在创建视图、函数、存储过程、触发器、事件时尤为重要。DEFINER 实际上指的是对象的创建者,当在创建语句中指定 DEFINER = user 时,即是明确地指定了此对象的定义者为 user。默认情况下,如果没有显式指定,创建对象的用户自动成为定义者。
在定义对象时,还可以设置 SQL SECURITY 属性,其值可以是 DEFINER 或 INVOKER。当 SQL SECURITY 为 DEFINER 时,表示执行时会以定义者的权限进行,反之,SQL SECURITY 为 INVOKER 表示以调用者的权限进行执行。默认情况下,SQL SECURITY 属性设为 DEFINER,此时要求定义者用户存在,并且拥有对应操作权限及引用对象的权限。而当 SQL SECURITY 为 INVOKER 时,则要求调用者拥有相应的权限和引用对象的权限。
举个例子,假设创建了一个视图,查询了三张表 a、b、c,并且 SQL SECURITY 属性设为 DEFINER,那么用户 u 查询此视图时,只需有视图的查询权限即可。但如果 SQL SECURITY 属性设为 INVOKER,则用户 u 需要有视图的查询权限,同时 a、b、c 三张表的查询权限。
在实践中,只有拥有创建权限且具有 SUPER 权限的用户才能创建 DEFINER = 其他用户 的对象。例如,root 账号可以创建 DEFINER = testuser 的视图,而 testuser 在具备创建视图的权限下只能创建 DEFINER 为其自身的视图。
在某些特殊情况下,如果用户 u1 不存在,即使 root 账号创建了 DEFINER = u1 的视图,当试图使用 root 账号查询时,会因用户不存在而报错。反之,如果用户 u2 存在但不具有查询表 a 的权限,root 账号创建的 DEFINER = u2 视图用于查询表 a 时,会报缺少权限的错误。若视图的 SQL SECURITY 属性设为 INVOKER,则 root 账号可以正常查询该视图。
了解并熟悉 DEFINER 相关概念,对于避免在实际应用中遇到错误至关重要。在日常开发中,应关注并理解其对权限和执行流程的影响,以确保对象的正确使用和维护。通过实践和经验积累,可以更有效地管理和利用这些特性,提高数据库操作的效率和安全性。
本文地址: http://www.goggeous.com/20250108/1/1328304
文章来源:天狐定制
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
2025-01-08职业培训
2025-01-08职业培训
2025-01-08职业培训
2025-01-08职业培训
2025-01-08职业培训
2025-01-08职业培训
2025-01-08职业培训
2025-01-08职业培训
2025-01-08职业培训
2025-01-08职业培训
2025-01-08 15:47:24职业培训
2025-01-08 15:47:23职业培训
2025-01-08 15:47:22职业培训
2025-01-08 15:47:13职业培训
2025-01-08 15:47:12职业培训
2025-01-08 15:47:12职业培训
2025-01-08 15:47:10职业培训
2025-01-08 15:47:10职业培训
2025-01-08 15:47:09职业培训
2025-01-08 15:46:59职业培训
2025-01-01 19:22职业培训
2024-12-04 11:21职业培训
2024-12-28 05:55职业培训
2025-01-05 15:32职业培训
2024-12-11 08:06职业培训
2024-12-05 00:15职业培训
2024-11-26 10:07职业培训
2024-12-13 15:02职业培训
2024-11-26 15:28职业培训
2025-01-05 14:33职业培训
扫码二维码
获取最新动态