SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.05.2010 17:10:16

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Commit в GRANT

Есть процедура, в которой используется GRANT/REVOKE.
Процедура вызывается из триггера.
При вызове триггера вылазит вот такое:

ERROR 1422 (HY000): Explicit or implicit commit is not allowed in stored function or trigger.

Есть ли какая-то опция, позволяющая запретить commit в GRANT?
Или придётся напрямую обновлять БД mysql? sad

Отредактированно Артём Н. (03.05.2010 17:10:40)


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#2 03.05.2010 23:01:15

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Commit в GRANT

Опции нету, и писать напрямую в таблицы — тоже плохое решение. Попробуйте
кэшировать изменения триггерами в какой-то отдельной табличке, а потом
проходиться по ней отдельной процедурой (например, по расписанию).

Неактивен

 

#3 04.05.2010 00:02:26

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Commit в GRANT

Да уж сделал прямой записью... sad


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#4 04.05.2010 14:19:50

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Commit в GRANT

А как Вы делаете FLUSH PRIVILEGES? Оно ж все равно дернет транзакцию?

Неактивен

 

#5 05.05.2010 11:19:11

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Commit в GRANT

Мда... Пока никак. Видимо, придётся через планировщик. sad


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#6 05.05.2010 11:20:52

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Commit в GRANT

Либо в процедуре изменения. Почти вся БД почти для всех пользователей меняется только через процедуры.

Да, чего-то я притормозил. С FLUSH PRIVILEGES проблем нет.
Просто я уже забыл, что мне нужно. Не высыпаюсь толком. sad
Во-первых, мне нужно менять группу пользователя или права группы.
Изменение делается через процедуру.
Изменение прав группы я, пока что, не буду реализовывать.

Изменение группы пользователя меняет только идентификатор группы в таблице пользователей.
Во-вторых, если у группы есть специальное право PRIV_INFOS_EDIT, на некоторые справочники, данному пользователю даются права INSERT/UPDATE/DELETE.

Практически, с БД работает клиент, используя процедуры.
Т.е. FLUSH PRIVILEGES, делает процедура.

Но, теоретически, root может напрямую поменять права группы или ID группы пользователя.
Чтобы права устанавливались корректно, я реализовал их изменение через триггеры.
Но, пользователь тогда пусть сам делает FLUSH PRIVILEGES.

Отредактированно Артём Н. (05.05.2010 11:33:41)


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#7 05.05.2010 14:13:07

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Commit в GRANT

Если Вы делаете это через процедуры — делайте обновления прав через
GRANT. Это правда лучше. Ну, хотя бы потому, что когда Ваше приложение
поставят на отличную от Вашей версию сервера, к Вам не прибегут со
словами «ничего не работает, такой колонки нету».

Также, возможно, имеет смысл разделять понятия «доступ к БД» и «доступ
внутри приложения». Никто не мешает иметь отдельную иерархию пользо-
вателей внутри приложения, и их уже ограничивать.

Неактивен

 

#8 05.05.2010 22:50:58

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Commit в GRANT

Если Вы делаете это через процедуры — делайте обновления прав через
GRANT. Это правда лучше. Ну, хотя бы потому, что когда Ваше приложение
поставят на отличную от Вашей версию сервера, к Вам не прибегут со
словами «ничего не работает, такой колонки нету».

Да я понимаю... Но у меня обновления в триггерах. sad А через процедуры, как-то... Мало-ли?

Также, возможно, имеет смысл разделять понятия «доступ к БД» и «доступ
внутри приложения». Никто не мешает иметь отдельную иерархию пользо-
вателей внутри приложения, и их уже ограничивать.

Они разделяются, но не настолько сильно. процедуры работают только с пользователями, данные которых находятся в таблицах приложения.
У меня же не WEB-интерфейс, на данный момент.
А обеспечить работу с пользователями может только встроенный механизм.
Конечно, возможно его повторить, в отдельно взятом приложении. :-\
Но зачем это делать, когда возможно им воспользоваться?


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#9 06.05.2010 11:34:42

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Commit в GRANT

Тогда только по хрону. Других вариантов я не вижу sad

Неактивен

 

#10 06.05.2010 11:44:46

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Commit в GRANT

Вот ещё здорово:

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)


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#11 06.05.2010 11:51:45

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Commit в GRANT

Код:

[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

Неактивен

 

#12 06.05.2010 12:13:08

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Commit в GRANT

o.O А в 5.1.39 ещё нет..? Или это я чего-то не того?


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#13 06.05.2010 12:15:04

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Commit в GRANT

Похоже, что проблема в GRANT OPTION. sad


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#14 06.05.2010 13:17:51

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Commit в GRANT

Аха. Не надо GRANT OPTION раздавать smile

Неактивен

 

#15 06.05.2010 14:06:34

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Commit в GRANT

В руководстве своеобразное описание синтаксиса для REVOKE ALL PRIVILEGES:
http://dev.mysql.com/doc/refman/5.1/en/revoke.html
Тогда мне не понятно что делает GRANT OPTION.


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#16 06.05.2010 14:12:21

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Commit в GRANT

Хм...

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)


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#17 06.05.2010 14:15:16

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Re: Commit в GRANT

У меня такое подозрение, что revoke all on *.* не удалит из Tables_priv...

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'admin'@'%';;
Query OK, 0 rows affected (0.00 sec)

sad

Отредактированно Артём Н. (06.05.2010 14:18:34)


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson