限制对MySQL中的行子集的访问
我非常喜欢数据库noob:-(如果我有一个这样设计的简单表:限制对MySQL中的行子集的访问,mysql,security,Mysql,Security,我非常喜欢数据库noob:-(如果我有一个这样设计的简单表: CREATE TABLE IF NOT EXISTS picture ( ID INT NOT NULL AUTO_INCREMENT, userID INT NOT NULL, name VARCHAR(150), PRIMARY KEY(ID), FOREIGN KEY (userID) REFERENCES user(ID) )ENGINE=InnoDB 例如,描述如下: +----+--------+------+ | I
CREATE TABLE IF NOT EXISTS picture
(
ID INT NOT NULL AUTO_INCREMENT,
userID INT NOT NULL,
name VARCHAR(150),
PRIMARY KEY(ID),
FOREIGN KEY (userID) REFERENCES user(ID)
)ENGINE=InnoDB
例如,描述如下:
+----+--------+------+
| ID | userID | name |
+----+--------+------+
| 1 | 1 | john |
| 2 | 1 | jack |
| 3 | 2 | amir |
| 4 | 2 | chan |
| 5 | 2 | jose |
| 6 | 3 | jane |
| 7 | 3 | buba |
+----+--------+------+
如何设计满足以下两个约束条件的数据库:
1
、2
和3
可以向图片
表添加新条目1
、2
和3
只能分别修改具有userID
s1
、2
和3
的行我知道这可能不是小事,所以请随意询问任何其他问题,我将相应地编辑此问题。对于第一项,您可以为用户1、2和3授予图片表的插入权限 对于第二项,您可以执行以下操作: A.创建一个额外的表(db_logins),其中包含userID和数据库登录之间的映射
+----+--------+--------------+
| ID | userID | db_loginname |
+----+--------+--------------+
| 1 | 1 | dbLogin1 |
| 2 | 2 | dbLogin2 |
| 3 | 3 | dbLogin3 |
+----+--------+--------------+
B.无论何时进行更新,都要在WHERE子句中添加check for db_loginname。update语句的外观如下(我目前没有访问MySQL实例的权限,因此无法验证语法):
我把这些放在一起:
delimiter //
CREATE TRIGGER trig_picture BEFORE UPDATE ON picture
FOR EACH ROW
BEGIN
DECLARE dummy INT;
IF NOT EXISTS (select ID from users where ID = OLD.userID and name = (SELECT SUBSTRING_INDEX(USER(), '@', 1))) THEN
SET NEW=(SELECT CONCAT("Access Denied for user ", SUBSTRING_INDEX(USER(), '@', 1), "; uid ", OLD.userID));
END IF;
END;//
delimiter ;
这假设您有一个users
表,其中包含一些条目:
CREATE TABLE IF NOT EXISTS users ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(150) );
insert into users values (1, 'adam');
insert into users values (2, 'bob');
insert into users values (3, 'clark');
这假定users
表中的名称与SELECT SUBSTRING\u INDEX(user(),'@',1)
返回的数据库用户名匹配
另外,请注意,这只会阻止更新的发生。您还必须创建额外的插入/删除触发器,以防止创建/删除条目
最后,这并不能阻止某人更改图片表中其条目的用户ID,实际上是将其从进一步编辑中锁定。如果这对您很重要,您可以为此在触发器中添加一个额外的检查。可能会在表上添加一个触发器,拒绝基于用户名修改行?我认为它是w嗯,但后来意识到,如果OP只想更新与当前用户/更新参数匹配的行,而忽略其他行,那么对广泛的update语句来说可能不太好。感谢您的响应。我很好奇这将如何防止用户删除其他人的数据行?正如Corey在上面提到的那样,我是否可以强制执行此操作(“触发器”)。与上述方法相同的方法也适用于DELETE语句。正如Corey提到的,触发器可能也适用于此:您将为UPDATE/DELETE创建一个触发器,该触发器将使用MySQL的user()检查可能受影响的行是否属于当前db用户函数,然后继续或取消修改。使用触发器将取决于您希望如何处理“广泛”更新(即,如果您以用户1的身份执行更新,这将影响5行,其中3行“属于”用户2,另外2行“属于”用户1,您希望完全忽略更新还是更新2条记录)据我所知,触发器类似于回调。我将查看它们,并在接下来的24小时内回复您。
CREATE TABLE IF NOT EXISTS users ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(150) );
insert into users values (1, 'adam');
insert into users values (2, 'bob');
insert into users values (3, 'clark');