限制对MySQL中行的子集的访问

限制对MySQL中行的子集的访问

我完全是数据库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

例如,描述如下:
+----+--------+------+
| ID | userID | name |
+----+--------+------+
|  1 |      1 | john |
|  2 |      1 | jack |
|  3 |      2 | amir |
|  4 |      2 | chan |
|  5 |      2 | jose |
|  6 |      3 | jane |
|  7 |      3 | buba |
+----+--------+------+

如何设计满足以下两个约束的数据库:
用户123可以向pictures表添加新条目。
用户只能修改具有1s23userID的行
我知道这可能不是小事,所以请随意提出任何其他问题,我将相应地编辑此问题。

最佳答案

我把这个放在一起:

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_INDEX(USER(), '@', 1)返回的数据库用户名匹配。
另外,请注意,这只会阻止更新的发生。您还必须创建其他插入/删除触发器,以防止创建/删除条目。
最后,这并不能阻止某人更改pictures表中条目的用户标识,实际上是将他们从进一步的编辑中锁定。如果这对您很重要,您可以在触发器中添加一个额外的检查。

关于mysql - 限制对MySQL中行的子集的访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10169157/

10-09 16:12