TL;DR
これは5.7のバグ。8.0では起こらない
エラーメッセージからここへ来たあなたへ。
use
ステートメントを忘れています。use
してからもういちどCREATE VIEW
なりALTER VIEW
なりを実行するのです
スキーマを何も指定せずに接続して、かつ、FROM句サブクエリがあるものを実行しようとするとエラる。ビュー名を完全修飾していても、使っているテーブルを完全修飾していてもエラる。しかも root@localhost
なのに ANY command denied
とか言われてビビる。
【2024/04/06 18:41】
しかも ANY command と言われて サブクエリのANY なんてどこにも使ってないよと余計混乱した
mysql57 9> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| NULL |
+------------+
1 row in set (0.00 sec)
mysql57 9> ALTER VIEW d1.v1 AS SELECT * FROM (SELECT * FROM d1.t1) AS t;
ERROR 1142 (42000): ANY command denied to user 'root'@'localhost' for table ''
どこでも良いので use
でデフォルトスキーマを指定するとエラーにならなくなる。
mysql57 9> use mysql
Database changed
mysql57 9> ALTER VIEW d1.v1 AS SELECT * FROM (SELECT * FROM d1.t1) AS t;
Query OK, 0 rows affected (0.00 sec)
なお、ビュー名または使っているテーブルが完全修飾されていない場合はちゃんと想像どおりのエラーで転ける。
mysql57 8> ALTER VIEW v1 AS SELECT * FROM (SELECT * FROM d1.t1) AS t;
ERROR 1046 (3D000): No database selected
mysql57 8> ALTER VIEW d1.v1 AS SELECT * FROM (SELECT * FROM t1) AS t;
ERROR 1046 (3D000): No database selected
WHERE句サブクエリの場合は完全修飾していれば転けない。完全修飾していなければ No database selected
のエラー。
mysql57 8> ALTER VIEW d1.v1 AS SELECT * FROM d1.t1 WHERE num IN (SELECT num FROM d1.t1);
Query OK, 0 rows affected (0.00 sec)
mysql57 8> ALTER VIEW d1.v1 AS SELECT * FROM d1.t1 WHERE num IN (SELECT num FROM t1);
ERROR 1046 (3D000): No database selected
8.0ではFROM句で完全修飾していてもこのエラーは起こらずに成功する。
mysql80 18> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| NULL |
+------------+
1 row in set (0.01 sec)
mysql80 18> ALTER VIEW d1.v1 AS SELECT * FROM (SELECT * FROM d1.t1) AS t;
Query OK, 0 rows affected (0.02 sec)
root@localhost
なのに ANY command denied
とか言われるので壊したかと思った…
0 件のコメント :
コメントを投稿