Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
限制对MySQL中的行子集的访问_Mysql_Security - Fatal编程技术网

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

限制对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

我非常喜欢数据库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
    可以向
    图片
    表添加新条目
  • 用户
    1
    2
    3
    只能分别修改具有
    userID
    s
    1
    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');