Задавайте вопросы, мы ответим
Вы не зашли.
Есть процедура, в которой используется GRANT/REVOKE.
Процедура вызывается из триггера.
При вызове триггера вылазит вот такое:
ERROR 1422 (HY000): Explicit or implicit commit is not allowed in stored function or trigger.
Есть ли какая-то опция, позволяющая запретить commit в GRANT?
Или придётся напрямую обновлять БД mysql?
Отредактированно Артём Н. (03.05.2010 17:10:40)
Неактивен
Опции нету, и писать напрямую в таблицы — тоже плохое решение. Попробуйте
кэшировать изменения триггерами в какой-то отдельной табличке, а потом
проходиться по ней отдельной процедурой (например, по расписанию).
Неактивен
Да уж сделал прямой записью...
Неактивен
А как Вы делаете FLUSH PRIVILEGES? Оно ж все равно дернет транзакцию?
Неактивен
Мда... Пока никак. Видимо, придётся через планировщик.
Неактивен
Либо в процедуре изменения. Почти вся БД почти для всех пользователей меняется только через процедуры.
Да, чего-то я притормозил. С FLUSH PRIVILEGES проблем нет.
Просто я уже забыл, что мне нужно. Не высыпаюсь толком.
Во-первых, мне нужно менять группу пользователя или права группы.
Изменение делается через процедуру.
Изменение прав группы я, пока что, не буду реализовывать.
Изменение группы пользователя меняет только идентификатор группы в таблице пользователей.
Во-вторых, если у группы есть специальное право PRIV_INFOS_EDIT, на некоторые справочники, данному пользователю даются права INSERT/UPDATE/DELETE.
Практически, с БД работает клиент, используя процедуры.
Т.е. FLUSH PRIVILEGES, делает процедура.
Но, теоретически, root может напрямую поменять права группы или ID группы пользователя.
Чтобы права устанавливались корректно, я реализовал их изменение через триггеры.
Но, пользователь тогда пусть сам делает FLUSH PRIVILEGES.
Отредактированно Артём Н. (05.05.2010 11:33:41)
Неактивен
Если Вы делаете это через процедуры — делайте обновления прав через
GRANT. Это правда лучше. Ну, хотя бы потому, что когда Ваше приложение
поставят на отличную от Вашей версию сервера, к Вам не прибегут со
словами «ничего не работает, такой колонки нету».
Также, возможно, имеет смысл разделять понятия «доступ к БД» и «доступ
внутри приложения». Никто не мешает иметь отдельную иерархию пользо-
вателей внутри приложения, и их уже ограничивать.
Неактивен
Если Вы делаете это через процедуры — делайте обновления прав через
GRANT. Это правда лучше. Ну, хотя бы потому, что когда Ваше приложение
поставят на отличную от Вашей версию сервера, к Вам не прибегут со
словами «ничего не работает, такой колонки нету».
Да я понимаю... Но у меня обновления в триггерах. А через процедуры, как-то... Мало-ли?
Также, возможно, имеет смысл разделять понятия «доступ к БД» и «доступ
внутри приложения». Никто не мешает иметь отдельную иерархию пользо-
вателей внутри приложения, и их уже ограничивать.
Они разделяются, но не настолько сильно. процедуры работают только с пользователями, данные которых находятся в таблицах приложения.
У меня же не WEB-интерфейс, на данный момент.
А обеспечить работу с пользователями может только встроенный механизм.
Конечно, возможно его повторить, в отдельно взятом приложении. :-\
Но зачем это делать, когда возможно им воспользоваться?
Неактивен
Тогда только по хрону. Других вариантов я не вижу
Неактивен
Вот ещё здорово:
mysql> call UserDel('admin', '%');;
+----------------------------------------------------------+
| @cu |
+----------------------------------------------------------+
| REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'admin'@'%'; |
+----------------------------------------------------------+
1 row in set (0.00 sec)
ERROR 1295 (HY000): This command is not supported in the prepared statement protocol yet
Т.е., GRANT поддерживается, а REVOKE Нет?
Отредактированно Артём Н. (06.05.2010 11:45:26)
Неактивен
[celestia] root mysql > prepare p from 'revoke all on *.* from user@localhost'; Query OK, 0 rows affected (0.00 sec) Statement prepared [celestia] root mysql > execute p; Query OK, 0 rows affected (0.00 sec) [celestia] root mysql > deallocate prepare p; Query OK, 0 rows affected (0.00 sec)
5.1.44
Неактивен
o.O А в 5.1.39 ещё нет..? Или это я чего-то не того?
Неактивен
Похоже, что проблема в GRANT OPTION.
Неактивен
Аха. Не надо GRANT OPTION раздавать
Неактивен
В руководстве своеобразное описание синтаксиса для REVOKE ALL PRIVILEGES:
http://dev.mysql.com/doc/refman/5.1/en/revoke.html
Тогда мне не понятно что делает GRANT OPTION.
Неактивен
Хм...
mysql> call UserDel('admin', '%');;
+------------------------------------------+
| @cu |
+------------------------------------------+
| REVOKE ALL PRIVILEGES FROM 'admin'@'%'; |
+------------------------------------------+
1 row in set (0.50 sec)
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'FROM
'admin'@'%'' at line 1
Отредактированно Артём Н. (06.05.2010 14:19:02)
Неактивен
У меня такое подозрение, что revoke all on *.* не удалит из Tables_priv...
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'admin'@'%';;
Query OK, 0 rows affected (0.00 sec)
Отредактированно Артём Н. (06.05.2010 14:18:34)
Неактивен