ちょっとひっかかかったのでメモ.
最初に完成形
username, databasename, passwordの部分を書き直して利用します。
# username,password,databasenameを置き換える
# ユーザ作成
CREATE USER 'username'@'%' IDENTIFIED BY 'password' ;
# 権限付与
GRANT
SELECT,
INSERT,
UPDATE,
DELETE,
CREATE,
DROP,
REFERENCES,
INDEX,
ALTER,
CREATE TEMPORARY TABLES,
LOCK TABLES,
EXECUTE,
CREATE VIEW,
SHOW VIEW,
CREATE ROUTINE,
ALTER ROUTINE,
TRIGGER
ON `databasename`.*
TO 'username'@'%'
;
# [OPTION]SQL実行前に実行されるスクリプトを設定(パラメタグループのinit_commandで指定)している場合はそのスクリプトの実行権限(EXECUTE)を付与
# 以下では古いRDS用に設定してい「UTCを日本時間にする」スクリプトの実行権限を付与
GRANT EXECUTE ON PROCEDURE `mysql`.`adjust_time_zone` TO 'username'@'%';
# ユーザ一覧を表示
SELECT user, host FROM mysql.user;
ひっかかったところ
2つあって、1つは権限付与時のIncorrect usage of DB GRANT and GLOBAL PRIVILEGESエラー。
もう1つはSQL実行時の**Access Denied (init_command)**エラー。
権限エラーの原因と対処
公式サイトに記載されている権限一覧表の「コンテキスト列」の値が「サーバ管理」となっている権限はデータベース単位では付与できません。例えば ALL, SHOW DATABASESなどです。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.2.1 MySQL で提供される権限
RDSのマスタユーザの権限を元に作成しようとしたので余計な権限が付与されていた。というオチでした。汗
RDS MySQL でマスターユーザー権限を持つユーザーの新規登録
SQL実行時エラー(init_command)
古いRDSではデータベースサーバの時刻がUTCとなっていて恒久的な設定変更ができませんでした。
このためパラメタグループのinit_commandに時刻調整用スクリプトを設定するというハックが必要でした。
このスクリプトの実行権限が付与されていなかったのが原因でした。
GRANT EXECUTE ON PROCEDURE `mysql`.`adjust_time_zone` TO 'username'@'%';