SQL триггеры для предоставления / отзыва привилегий - PullRequest
4 голосов
/ 28 мая 2011

Можно ли создать триггеры, которые будут предоставлять или отзывать разрешения для пользователей в MySQL 5.1?

Я попробовал это:

delimiter //

create trigger sup_tog
before update on members
for each row begin
if old.fname = "xyz" and new.status = "b"
then
revoke select, update on mkdb.* from xyz;
end if;

end//

Полученное сообщение об ошибке:

Код ошибки: 1422. Явный или неявный коммит не разрешен в хранимых функция или триггер.

Ответы [ 2 ]

2 голосов
/ 28 мая 2011

Вы можете напрямую управлять таблицами прав в базе данных mysql.

Таблица mysql.user содержит универсальные права для пользователей (права доступа ко всем базам данных)
Таблица mysql.db содержит права доступа длябаза данных
таблица mysql.table_priv: права доступа для таблицы

Измените триггер на:

DELIMITER $$

CREATE TRIGGER bu_members BEFORE UPDATE ON members FOR EACH ROW
BEGIN
  IF old.fname = "xyz" AND new.status = "b" THEN BEGIN
    /*revoke select, update on mkdb.* from xyz;*/
    UPDATE mysql.db SET 
      select_priv = 'N'
      , update_priv = 'N' 
    WHERE mysql.db.user = 'xyz' AND mysql.db.db = 'mkdb';
  END; END IF;

END $$

Обратите внимание, что изменения вступят в силу только после завершения текущей транзакции.
Это должно происходить вне триггера, как уже объяснил @Denis.

enter image description here Предупреждение
Остерегайтесь того, что структура схемы mysql может измениться (и имеетизменено в прошлом) .
Если это произойдет, ваш запрос может прерваться.
GRANT / REVOKE не вызывайте эту проблему.
Используйте этот вид кода с осторожностью и проверьте, чтобы увидетьесли все работает, если вы обновляете сервер MySQL.

2 голосов
/ 28 мая 2011

Дважды проверьте документы при предоставлении / отзыве.Ошибка предполагает, что они оба будут автоматически фиксироваться.Это не может произойти во время самого триггера, так как последний срабатывает как часть текущей транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...