タイトルの通りなんですが
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は接続ではなくて、スキーマ識別を明示しなかったときのデフォルト値セット程度の意味しかない、ってことの再確認でした。
- 作者: 鈴木啓修,山田奈緒子
- 出版社/メーカー: 技術評論社
- 発売日: 2014/12/18
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る