1

我是数据库菜鸟:-(如果我有一个这样设计的简单表:

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. 用户12并且3可以向pictures表中添加新条目。
  2. 用户1,23只能修改那些分别有,和userID的行123

我知道这可能不是微不足道的,所以请随时提出任何其他问题,我会相应地编辑这个问题。

4

2 回答 2

2

根据这个答案,我把它放在一起:

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)

另外,请注意,这只会阻止更新发生。您还必须创建额外的插入/删除触发器以防止创建/删除条目。

最后,这不会阻止某人更改他们在图片表中的条目的用户 ID,实际上将他们锁定在进一步的编辑之外。如果这对您很重要,您可以在触发器中为此添加额外的检查。

于 2012-04-19T21:55:10.910 回答
1

对于第一项,您可以只授予用户 1、2 和 3 对图片表的 INSERT 权限。

对于第二项,您可以执行以下操作:

A. 创建一个附加表 (db_logins),其中包含用户 ID 和数据库登录之间的映射。

+----+--------+--------------+
| ID | userID | db_loginname |
+----+--------+--------------+
|  1 |      1 | dbLogin1     |
|  2 |      2 | dbLogin2     |
|  3 |      3 | dbLogin3     |
+----+--------+--------------+

B. 每当您进行更新时,将 db_loginname 的检查添加到 WHERE 子句。UPDATE 语句看起来像这样(我目前无权访问 MySQL 实例,因此无法验证语法):

UPDATE pictures
SET name = 'new name'
FROM pictures
INNER JOIN db_logins 
    ON pictures.userID = db_logins.userID
WHERE name = 'buba' 
   AND db_loginname = user()
于 2012-04-16T05:51:00.507 回答