Как я могу проверить тип данных BIT в MySQL? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть столбец в users таблице с именем permissions.Например:

// users
+---------+-----------------+-------------+
|   id    | permissions     |    name     |
+---------+-----------------+-------------+
| int(11) | bit(15)         | varchar(20) |
+---------+-----------------+-------------+
| 1       | 001100001111101 | Jack        |
| 2       | 111111111111111 | Peter       |
| 3       | 110000000111011 | Martin      |
+---------+-----------------+-------------+

Как видите, столбец permissions имеет тип данных bit(15).Каждый бит этого значения определяет одну способность пользователя.Например, первый бит относится к способности voting, второй - к муравью commenting и т.д. ...

Также у меня есть триггер BEFORE UPDATE, который исследует это разрешение следующим образом:

SELECT permissions INTO @deleting_permission FROM users WHERE id = new.deleter_id;

IF old.deleted <> new.deleted THEN
IF (IFNULL((@deleting_permission & b'10000000000' > 0), 0) < 1) THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "You cannot delete post";
END IF;
END IF;

И всегда выдает:

Вы не можете удалить сообщение

Даже для # 2 пользователя , который имеет 111111111111111 значение разрешения.Так что не так?


Заметил, что я обновляю столбец permissions следующим образом:

-- To give some specific accesses (permissions) to the user
UPDATE users SET permissions = b'111111000101011' WHERE id = ?

-- To give full access (permissions) to the user
UPDATE users SET permissions = -1 WHERE id = ?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вы выбираете поле active в триггере, чтобы проверить разрешение, но в соответствии с вашим вопросом права сохраняются в поле permissions.

Измените свой запрос, чтобы использовать последнее поле:

SELECT `permissions` INTO @active_deleter FROM users WHERE id = new.deleter_id;

Кроме того, ваше поле permissions имеет 15 битов.Маска, которую вы используете, имеет только 10. Вы должны проверить, проверяете ли вы правильный бит в первую очередь.

0 голосов
/ 24 мая 2018

Если вы хотите работать с типом BIT, вам нужно использовать побитовые операторы, а не обычные операторы.Например, если вы хотите проверить, задан ли для пользователя самый левый бит в качестве разрешения, вы можете выполнить операцию &:

SELECT permissions INTO @p FROM users WHERE id = new.deleter_id;


IF old.deleted <> new.deleted THEN
    IF (b'100000000000000' & @p = 0)
    THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "You cannot delete post";
    END IF;
END IF;

Основная идея, представленная выше, состоит в том, что литерал b'100000000000000'служит mask , которую можно использовать для определения, установлен ли самый левый бит (и только этот бит) в 1. Если он установлен в 1, то операция & не вернет 0.

Причина, по которой пользователь с разрешениями 111111111111111 обладает всеми правами, заключается в том, что любая проверка битов маски возвращает значение true.

...