なからなLife

geekに憧れと敬意を抱きながら、SE、ITコンサル、商品企画、事業企画、管理会計、総務・情シス、再び受託でDB屋さんと流浪する人のブログです。

MySQLで接続(use)しているDB(スキーマ)が、他セッションからDROPされたときって、どうなるんだっけ?

タイトルの通りなんですが

USE文って、所詮デフォルトデータベースの宣言(データベース名無宣言でオブジェクト名を扱うときに、どこを指しているとみなすか)にすぎないと思っていて、「じゃあ、その状態で指している先がDROP DATABASEされたらどうなるんよ?」って。



実験

「grant select ON droptest.* to 'droptester'@'%';」しかしてないユーザーで接続します。
「--prompt="[\d] (\u)> "」付けてます。

[(none)] (droptester)> select user();
+--------------------------+
| user()                   |
+--------------------------+
| droptester@192.168.1.249 |
+--------------------------+
1 row in set (0.04 sec)

[(none)] (droptester)> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| droptest           |
+--------------------+
2 rows in set (0.04 sec)

[(none)] (droptester)> use droptest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
[droptest] (droptester)> select database();
+------------+
| database() |
+------------+
| droptest   |
+------------+
1 row in set (0.04 sec)

この状態から、別セッションを使って、「DROP DABATASE droptest」した結果、以下のようになりました。

[droptest] (droptester)> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.04 sec)

[droptest] (droptester)> select database();
+------------+
| database() |
+------------+
| droptest   |
+------------+
1 row in set (0.04 sec)

[droptest] (droptester)> show tables;
ERROR 1049 (42000): Unknown database 'droptest'

こんな感じ。

まとめ

MySQLで接続(use)しているDB(スキーマ)が、他セッションからDROPされたとき
・USE宣言したDBをDROPされても、セッションにはメッセージは出ない。
・カレントデータベースを確認すると、削除したDBのUSEが有効になっている。
・削除したDB内のオブジェクトを参照しないSQLは実行可能。
・削除したDB内のオブジェクトを参照するSQLはエラー。でも、セッションを切断や、カレントデータベース切り替えなどは発生しない。




まあ、おおかた予想通りなんですけどね。
USEは接続ではなくて、スキーマ識別を明示しなかったときのデフォルト値セット程度の意味しかない、ってことの再確認でした。


MariaDB&MySQL全機能バイブル

MariaDB&MySQL全機能バイブル