web-dev-qa-db-ja.com

ユーザーにスーパー特権を与える方法は?

ユーザーを作成し、user1に特権を与えました。

`grant all privileges on db1.* to user1@'%' with grant option;

Mysqlワークベンチを使用してダンプをデータベースにインポートしています。ダンプをデータベースdb1にインポートしているときに、

ERROR 1227 (42000) at line 49: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

そのダンプでは、すべてのテーブルが正常にインポートされますが、ルーチンをデータベースにインポートしているときにエラーが発生します。権限に問題はありませんか、私はuser1に与えました。アドバイスを下さい。

46

政治的に正しい意味では、あなたが要求したことは不可能です。どうして ?

SUPER特権 はグローバルレベルの特権であり、データベースレベルの特権ではありません。

でユーザーを作成したとき

grant all privileges on db1.* to user1@'%' with grant option;

テーブルmysql.userにuser = user1およびHost = '%'を入力しました。他のすべての列(グローバル特権)のデフォルトは「N」でした。それらの列の1つはSuper_privです。ここにテーブルがあります:

mysql> desc mysql.user;
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field                  | Type                              | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host                   | char(60)                          | NO   | PRI |         |       |
| User                   | char(16)                          | NO   | PRI |         |       |
| Password               | char(41)                          | NO   |     |         |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N       |       |
| File_priv              | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N       |       |
| References_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher             | blob                              | NO   |     | NULL    |       |
| x509_issuer            | blob                              | NO   |     | NULL    |       |
| x509_subject           | blob                              | NO   |     | NULL    |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0       |       |
| plugin                 | char(64)                          | YES  |     |         |       |
| authentication_string  | text                              | YES  |     | NULL    |       |
| password_expired       | enum('N','Y')                     | NO   |     | N       |       |
+------------------------+-----------------------------------+------+-----+---------+-------+
43 rows in set (0.00 sec)

mysql>

Super_privShow_db_privの直後に表示されます。

データベースレベルの権限がmysql.dbに入力されました。はい、これ:

mysql> desc mysql.db;
+-----------------------+---------------+------+-----+---------+-------+
| Field                 | Type          | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host                  | char(60)      | NO   | PRI |         |       |
| Db                    | char(64)      | NO   | PRI |         |       |
| User                  | char(16)      | NO   | PRI |         |       |
| Select_priv           | enum('N','Y') | NO   |     | N       |       |
| Insert_priv           | enum('N','Y') | NO   |     | N       |       |
| Update_priv           | enum('N','Y') | NO   |     | N       |       |
| Delete_priv           | enum('N','Y') | NO   |     | N       |       |
| Create_priv           | enum('N','Y') | NO   |     | N       |       |
| Drop_priv             | enum('N','Y') | NO   |     | N       |       |
| Grant_priv            | enum('N','Y') | NO   |     | N       |       |
| References_priv       | enum('N','Y') | NO   |     | N       |       |
| Index_priv            | enum('N','Y') | NO   |     | N       |       |
| Alter_priv            | enum('N','Y') | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y') | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y') | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y') | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y') | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y') | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y') | NO   |     | N       |       |
| Execute_priv          | enum('N','Y') | NO   |     | N       |       |
| Event_priv            | enum('N','Y') | NO   |     | N       |       |
| Trigger_priv          | enum('N','Y') | NO   |     | N       |       |
+-----------------------+---------------+------+-----+---------+-------+
22 rows in set (0.00 sec)

mysql>

Super_privmysql.dbに存在しないことに注意してください。

これを純粋なSQL用語で視覚化するには、user1としてログインしてSHOW GRANTS;を実行します。出力には2行あります。

  • GRANT USAGE ON *.* TO user1@'%' ...
  • GRANT ALL PRIVILEGES ON db1.* TO user1@'%' ...

あなたが試すことができるハックがありますが、私は通常それをお勧めしません。

ステップ01)root @ localhostとしてmysqlにログインします(すべての特権が必要です)

ステップ02)このクエリを実行する

UPDATE mysql.user SET Super_Priv='Y' WHERE user='user1' AND Host='%';

ステップ03)このクエリを実行する

FLUSH PRIVILEGES;

それは理論的にはうまくいくはずです。その後、user1が動作する可能性があります(私は保証しません)。

UPDATE 2014-12-19 15:24 EST

Metafaniel たった今

素晴らしい説明、ありがとう。ただし、問題を解決するためにその方法を推奨しない場合、ユーザーにこのSuper_privを許可するために最適な方法は他にありますか?ありがとう! –メタファニエル

DBアクセスのみを持つユーザーは [〜#〜] super [〜#〜] を持つことができないため、ダンプ内で手動でDEFINERを変更することしかできません。基本的な考え方は、テキストファイルにルーチンだけをmysqldumpすることです。次に、定義者をuser1@'%'に編集します。その後、リロードできるはずです。

ビューについて同じこと

37
RolandoMySQLDBA

私はまったく同じ問題を抱えていました。私がしたことは:

GRANT SUPER ON *.* TO user1@localhost

そして問題は解決しました。

警告: ユーザーにスーパー特権を付与することに危険はありますか?

25
carla

インポートプロセス中の「アクセス拒否」エラーは、エクスポートされたデータベースとインポートされるデータベースの間のDEFINERの権限の不一致が原因である可能性があります。私は同じ状況に直面し、以下のコマンドがデータベースを正常にインポートするためにうまく機能しました。

cat db1.sql | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user1 -p db1
1
Muniraj