2024/04/05

CREATE VIEW, ALTER VIEWのERROR 1142 (42000): ANY command denied to user 'root'@'localhost' for table ''にハマった

TL;DR


スキーマを何も指定せずに接続して、かつ、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 件のコメント :

コメントを投稿