我完全是数据库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 |
+----+--------+------+
如何设计满足以下两个约束的数据库:
用户
1
、2
和3
可以向pictures
表添加新条目。用户只能修改具有
1
s2
、3
和userID
的行我知道这可能不是小事,所以请随意提出任何其他问题,我将相应地编辑此问题。
最佳答案
我把这个放在一起:
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/