発生したエラー

1[PDOException] SQLSTATE[42000]: Syntax error or access violation: 1227 Access denied; you need (at least one of) the SUPER privilege(s) for this operation 

メッセージをみると 操作権限がなく、拒否された 事がわかりますね。

原因

原因は「View を生成時のユーザとは別のユーザで Alter View しようとし、権限エラーとなった」です。

View には DEFINER 属性があり、アクセスコントロールに用いられます。

この DEFINER は、SHOW CREATE VIEW を実行することで確認することができます。

1SHOW CREATE VIEW `view_name`;

をしてみると、結果に DEFINER が含まれることがわかると思います。

1DEFINER=`account`@`host`

対処方法

MySQL 8.0 Reference Manual
https://dev.mysql.com/doc/refman/8.0/en/alter-view.html

上記リファレンスより引用すると、 次のように ALTER 文で DEFINER を指定することができます。

1ALTER
2    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
3    [DEFINER = { user | CURRENT_USER }]
4    [SQL SECURITY { DEFINER | INVOKER }]
5    VIEW view_name [(column_list)]
6    AS select_statement
7    [WITH [CASCADED | LOCAL] CHECK OPTION]

しかしまあ、 DEFINER にはデフォルトでログイン中のユーザ (CURRENT_USER) が入るため、今回は「通常利用するユーザでログインして View を作り直す」ことで権限エラーを解消しました。


SHOW CREATE VIEW を実行し、 View の構造を出力し、控えておきます。

1SHOW CREATE VIEW `view_name`;

つぎに、 DROP VIEW で、 View を一旦削除します。

1DROP VIEW `view_name`;

最後に、控えておいた CREATE VIEW を実行して完了です。


これは View 特有のエラーであるため、スッと「 DEFINER かも ?」と疑うことができないと、原因特定までに時間がかかってしまいそうですね。