TiDB 中的 GRANT 与 MySQL 中的 GRANT 确实有一些不同之处。在 MySQL 中,GRANT 语句会为用户授予一组权限,并将这些权限添加到用户的权限列表中。如果用户已经拥有某个权限,再次执行 GRANT 语句时,该权限不会被重复授予。
在 TiDB 中,GRANT 语句的行为与 MySQL 有所不同。TiDB 中的 GRANT 语句会为用户授予一组权限,并将这些权限覆盖用户的权限列表。也就是说,如果用户已经拥有某个权限,再次执行 GRANT 语句时,该权限会被覆盖,而不是被重复授予。
这种行为的原因是 TiDB 的权限管理系统与 MySQL 有所不同。在 TiDB 中,权限是以角色为单位进行管理的。用户可以被授予一个或多个角色,每个角色包含一组权限。当用户登录 TiDB 时,系统会根据用户所属的角色来确定其权限列表。因此,TiDB 中的 GRANT 语句实际上是为用户授予一个角色,而不是为用户授予一组权限。如果用户已经拥有某个权限,再次执行 GRANT 语句时,该权限会被覆盖,因为 TiDB 认为用户已经拥有了该角色,不需要重复授予。
需要注意的是,TiDB 中的 GRANT 语句只能为用户授予角色,而不能为用户直接授予权限。如果需要为用户直接授予权限,可以先创建一个包含该权限的角色,然后为用户授予该角色。