在没有它的情况下授予INSERT。
假设每次创建新管理器时都会执行以下代码片段(当然,每次都使用不同的数据库和用户帐户名称):
#Executed as root
CREATE DATABASE `Manager1Section`;
CREATE TABLE Manager1Data(`SomeData` INT);
CREATE USER 'Manager1'@'localhost' IDENTIFIED BY 'Something';
GRANT SELECT, INSERT, UPDATE, DELETE ON `Manager1Section`.`Manager1Data` TO 'Manager1'@'localhost';
GRANT CREATE, DROP ON `Manager1Section`.* TO 'Manager1'@'localhost';
GRANT CREATE USER ON *.* TO 'Manager1Section'@'localhost' WITH GRANT OPTION;
每次创建新的实习生时,都会执行以下代码(同样,名称被替换):
#Executed as manager
CREATE TABLE `Manager1Section`.`Intern1Data`(`Value` INT NOT NULL);
CREATE USER 'Intern1'@'localhost' IDENTIFIED BY 'Something';
GRANT SELECT, INSERT, UPDATE, DELETE ON `Manager1Section`.`Intern1Data` TO 'Intern1'@'localhost';
(请注意,这只是展示层次结构的一个例子。我实际上并没有对公司的人员结构进行建模。)
管理器管理单个数据库(在此示例中为Manager1Section)并具有要使用的表。管理员只能读取和写入该表,但不能放弃它。 (实际上没关系,我只是意识到经理可以放弃桌子。虽然不是什么大事。)。
此数据库中的每个实习生还有一个可以使用的表,并且同样只能读取和写入它,但不能删除它。此外,实习生只能访问他们自己的桌子,但不能访问经理的桌子,而不能访问其他实习生的桌子
而且非常重要的是:经理无法读写实习生的表格
上面的代码可以实现这一点,但它无效。第二个代码段中的最后一行失败。管理员对实习生的表没有SELECT,INSERT,UPDATE和DELETE权限,因此无法将这些权限授予实习生。将第一个代码段(GRANT CREATE, DROP ON `Manager1Section`.* TO 'Manager1'@'localhost';
)中的倒数第二行更改为GRANT CREATE, DROP, SELECT, INSERT, UPDATE, DELETE ON `Manager1Section`.* TO 'Manager1'@'localhost';
会使其工作,但它也允许管理员读取和写入实习生的表格,我想避免这种情况。“ BR />
如何让经理无法读取和写入实习生的表格,但仍然授予实习生读写权限?
或者:我怎样才能完全避免这个问题呢?
只允许用户授予他们已有的权限通常是一个好主意,我的直觉告诉我,我的预期解决方案是不可能的,因为经理可以通过创建欺骗实习生帐户来规避这种情况,执行GRANT SELECT, INSERT, UPDATE, DELETE ON `Manager1Section`.`Intern1Data` TO 'SpoofIntern'@'localhost';
(注意不匹配的用户名)然后通过该帐户访问数据。但我可能会遗漏一些东西,所以我在寻找想法。