Quantcast
Channel: なからなLife
Viewing all articles
Browse latest Browse all 173

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

$
0
0

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

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



実験

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

[(none)] (droptester)> selectuser();
+--------------------------+
| user()                   |
+--------------------------+
| droptester@192.168.1.249 |
+--------------------------+
1rowin set (0.04 sec)

[(none)] (droptester)> showdatabases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| droptest           |
+--------------------+
2rowsin set (0.04 sec)

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

Database changed
[droptest] (droptester)> selectdatabase();
+------------+
| database() |
+------------+
| droptest   |
+------------+
1rowin set (0.04 sec)

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

[droptest] (droptester)> showdatabases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1rowin set (0.04 sec)

[droptest] (droptester)> selectdatabase();
+------------+
| database() |
+------------+
| droptest   |
+------------+
1rowin set (0.04 sec)

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

こんな感じ。

まとめ

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




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


MariaDB&MySQL全機能バイブル

MariaDB&MySQL全機能バイブル


Viewing all articles
Browse latest Browse all 173

Trending Articles