MySQL不利于使用权限锁定基于连接到数据库的MySQL用户的某些行。
如果您有用户想要以这种方式进行限制,最好不要让他们直接访问数据库,而是让他们通过另一层进行连接。
使用视图并不是一个好主意 - 每个用户都必须使用不同的查询(引用他们自己的个人视图)来完成相同的任务。如果您只是限制用户可以看到的列(而不是行),则视图将是一个很好的解决方案。
它可以使用存储过程来完成像你要找的东西:
# This table already exists in your schema
CREATE TABLE `user` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`email` VARCHAR(50) NOT NULL,
`instance` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB;
INSERT INTO `user`(`id`,`email`,`instance`)
VALUES (NULL,'[email protected]','1');
INSERT INTO `user`(`id`,`email`,`instance`)
VALUES (NULL,'[email protected]','2');
INSERT INTO `user`(`id`,`email`,`instance`)
VALUES (NULL,'[email protected]','1');
# This would be a new table you would have to create
CREATE TABLE `user_instance` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user` VARCHAR(20) NOT NULL,
`instance` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_instance` (`user`,`instance`)
) ENGINE=INNODB;
INSERT INTO `user_instance`(`user`,`instance`) VALUES ('user1','1');
INSERT INTO `user_instance`(`user`,`instance`) VALUES ('user2','2');
# This is a stored procedure that might accomplish what you want
DELIMITER $$
CREATE PROCEDURE `p_get_users`()
BEGIN
SELECT `user`.`id`, `user`.`email`
FROM `user`
WHERE `user`.`instance` IN(
SELECT `instance`
FROM `user_instance`
WHERE `user` = USER());
END$$
DELIMITER ;
由于应用面正在增加实例= x到查询的护理MySQL的只是一个附加的安全如果查询意外没有实例= x。 – iDev247
只是测试你的代码,在代码中没有'意外'这样的事情 –
谢谢你所有的答案和冗长的讨论。我会考虑解决方案并给予适当的奖励。 @pyrate我同意没有意外的代码。有了多个开发人员,从长远来看,很难追踪这类事情。这个问题的另一个原因是向我们处理的公司保证,在站点之间访问用户信息时存在技术安全边界/限制。再次感谢! – iDev247