ユーザーを作成し、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に与えました。アドバイスを下さい。
政治的に正しい意味では、あなたが要求したことは不可能です。どうして ?
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_priv
はShow_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_priv
がmysql.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が動作する可能性があります(私は保証しません)。
Metafaniel たった今
素晴らしい説明、ありがとう。ただし、問題を解決するためにその方法を推奨しない場合、ユーザーにこのSuper_privを許可するために最適な方法は他にありますか?ありがとう! –メタファニエル
DBアクセスのみを持つユーザーは [〜#〜] super [〜#〜] を持つことができないため、ダンプ内で手動でDEFINERを変更することしかできません。基本的な考え方は、テキストファイルにルーチンだけをmysqldumpすることです。次に、定義者をuser1@'%'
に編集します。その後、リロードできるはずです。
Oct 02, 2011
: mysqldumpはトリガーとプロシージャをダンプできますか?Jul 25, 2011
: 存在する場合はドロップ手順がmysqldumpに含まれていないJul 25, 2011
: MySQLのストアドプロシージャのみをダンプビューについて同じこと
Mar 23, 2012
: MySQLビュー認証Jul 26, 2011
: 多くのビューでDEFINERを変更私はまったく同じ問題を抱えていました。私がしたことは:
GRANT SUPER ON *.* TO user1@localhost
そして問題は解決しました。
インポートプロセス中の「アクセス拒否」エラーは、エクスポートされたデータベースとインポートされるデータベースの間のDEFINERの権限の不一致が原因である可能性があります。私は同じ状況に直面し、以下のコマンドがデータベースを正常にインポートするためにうまく機能しました。
cat db1.sql | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user1 -p db1