问题是......是否可以添加MySQL权限以仅允许根据权限选择字段?
示例:
user1
只能从列users
等于instance
的{{1}}表中选择/插入/删除(1通过PHP传递)。1
只能从列user2
等于users
的{{1}}表中选择/插入/删除(1通过PHP传递)。以下是背景信息:
我正在创建一个具有相同代码库的应用程序,用于多个站点。应用程序中的条件加载不同的布局。多个站点使用相同的数据库,因为大多数信息可以在站点之间共享。在一个站点上注册的用户也必须在另一个站点上注册(这是我们想要的,因为这些站点“仅受邀请”)
我正在考虑做的是拥有用户表:id,email,password,instance。实例列将具有该站点的ID。
在每次我需要从此表中选择/插入/删除时,在应用程序层上,我将instance = [site_id]追加到查询...示例:instance
答案 0 :(得分:3)
不,权限是每个表,数据库,服务器等,但不是行,但是有一个解决方案,您可以使用视图表并为用户设置权限,例如
mysql> CREATE VIEW test.v AS SELECT * FROM t where email = '' AND instance = [site_id];
只需创建2个视图表并授予对这些用户的访问权限
答案 1 :(得分:2)
根据我所知,MySQL不允许有条件的用户。
为两个网站使用一个用户,并根据您的“实例”修改所有查询。因此,每当您查询某些特定于网站的内容时,您都会添加WHERE instance = $site_id
。
答案 2 :(得分:2)
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,'wat@lol.com','1');
INSERT INTO `user`(`id`,`email`,`instance`)
VALUES ( NULL,'huh@bwu.com','2');
INSERT INTO `user`(`id`,`email`,`instance`)
VALUES ( NULL,'no@yes.lol','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 ;