mysqlストレージ・プロシージャ権限の問題


インポート・ライブラリの開発に協力したとき、ライブラリにはストレージ・プロシージャの定義があることを注意してくれました.--routinesのオプションを使用しましたが、インポート時に問題が発生しました.
    1.ヒント:このストレージ・プロシージャを作成できません.ログを開くのを忘れました.bin_trust_function_creators変数、
    set global log_bin_trust_function_creators=on; その後、正常に作成され、サーバからもこの操作が必要になります.
はい、バイナリ・ログがROWであれば、このストレージ・プロシージャが上からあっても呼び出されません.
    2.インポートが成功すると、呼び出せない問題が発生し、検索しました.http://www.2cto.com/database/201403/288436.htmlこの文章は,この問題を記録している.
  • definerをuserとして作成adminのストアド・プロシージャ
  • mysql> DELIMITER //
    mysql> CREATE DEFINER='user_admin' PROCEDURE num1()
        -> BEGIN
        -> SELECT COUNT(id) FROM itopserver;
        -> END //
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    mysql> DELIMITER ;

    2.ユーザーを作成し、関連する権限を付与
    mysql> create user user_itop identified by '123456';
    Query OK, 0 rows affected (0.00 sec)
    mysql> grant select,insert,delete,update on itop.* to 'user_test'@'%';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show grants for user_test@'%';
    +---------------------------------------------------------------------+
    | Grants for user_test@%                                              |
    +---------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'user_test'@'%'                               |
    | GRANT SELECT, INSERT, UPDATE, DELETE ON `itop`.* TO 'user_test'@'%' |
    +---------------------------------------------------------------------+
    2 rows in set (0.00 sec)

    3.user_を使うtestはmysqlに接続し、さっき作成したprocedureを実行します.
    mysql> call num1;
    ERROR 1370 (42000): execute command denied to user 'user_test'@'%' for routine 'itop.num1'

    4.このように見るのは権限の問題です.彼に表を操作する方法しか与えられていないからです.itopのexecute権限を追加
    mysql> grant execute on itop.* to user_test@'%';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show grants for user_test@'%';
    +----------------------------------------------------------------------------------------------------------+
    | Grants for user_test@%                                                                                   |
    +----------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'user_test'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
    | GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `itop`.* TO 'user_test'@'%'                             |
    +----------------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)

    5.このユーザー接続Mysqlを再使用して、先ほど定義したストレージ・プロシージャを実行します.
    mysql> use itop;
    mysql> call num1();
    ERROR 1449 (HY000): The user specified as a definer ('user_admin'@'%') does not exist

    ストアド・プロシージャを呼び出すことができますが、ストアド・プロシージャ定義のdefinerが存在しないことを示します.
    MySQLサーバに接続しているユーザーだけがストレージ・プロシージャを実行する権限を持っているとは十分ではありません.
    最終的には、ストレージ・プロシージャ定義で指定したdefinerによってストレージ・プロシージャを実行します.
    6.user_と言うadminが存在しない場合はuser_を作成しますadminというユーザー
    mysql> grant select,insert,delete,update on itop.* to 'user_admin'@'%' identified by '123456';
    Query OK, 0 rows affected (0.00 sec)
    
    
    mysql> show grants for user_admin@'%';
    +-----------------------------------------------------------------------------------------------------------+
    | Grants for user_admin@%                                                                                   |
    +-----------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'user_admin'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
    | GRANT SELECT, INSERT, UPDATE, DELETE ON `itop`.* TO 'user_admin'@'%'                                      |
    +-----------------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)

    7.user_testユーザー接続Mysqlを再使用して、先ほど定義したストレージ・プロシージャを実行
    mysql> use itop;
    mysql> call num1();
    ERROR 1370 (42000): execute command denied to user 'user_admin'@'%' for routine 'itop.num1'

    8.MySQLサーバに接続されているユーザーだけでなく、ストアド・プロシージャ定義者もこの権限を必要としているようです.
    mysql> grant execute on itop.* to 'user_admin'@'%';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show grants for user_admin;
    +-----------------------------------------------------------------------------------------------------------+
    | Grants for user_admin@%                                                                                   |
    +-----------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'user_admin'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
    | GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `itop`.* TO 'user_admin'@'%'                             |
    +-----------------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)

    9.「user_test」ユーザー接続Mysqlを再使用して、先ほど定義したストレージ・プロシージャを実行
    mysql> use itop;
    mysql> call num1();
    +-----------+
    | COUNT(id) |
    +-----------+
    |       372 |
    +-----------+
    1 row in set (0.00 sec)
    Query OK, 0 rows affected (0.00 sec)

    実行できる