目次
とある日
今さながら、8.0.34の変更を少し触ってみる。
アップデート内容
MySQL :: MySQL 8.0 リリース ノート :: MySQL 8.0.34 の変更点 (2023 年 7 月 18 日、一般提供)
気になったやつ抜粋
- mysqlpumpが非推奨になり、将来削除される可能性があること
- binlog_formatが非推奨になり、将来削除される可能性があること
- mysql_native_passwordプラグインが非推奨になり、将来削除される可能性があること
その中で、「SQL 構文に関する注意事項」にあったCURRENT_USER()の変更について色々と触ってみた。
CURRENT_USER()
がテーブルのデフォルト値に使えるようになった
CURRENT_USER()
および ステートメントのVARCHAR
およびTEXT
列の デフォルト値として使用できるようになりました。CREATE TABLE
ALTER TABLE ... ADD COLUMN
関数
SESSION_USER()
、USER()
、および も、SYSTEM_USER()
今述べたすべてのケースでサポートされています。たとえば、次の一連のステートメントはここで示しているものと同様に機能しますが、正確な出力は環境に応じて異なります。
↓こんな感じで指定できるようになった。
CREATE TABLE t ( c1 VARCHAR(288) DEFAULT (USER()), c2 VARCHAR(288) DEFAULT (CURRENT_USER()), c3 VARCHAR(288) DEFAULT (SESSION_USER()), c4 VARCHAR(288) DEFAULT (SYSTEM_USER()) );
動作を試してみる
(root@localhost) [test] 8.0.34 > CREATE TABLE t ( -> c1 VARCHAR(288) DEFAULT (USER()), -> c2 VARCHAR(288) DEFAULT (CURRENT_USER()), -> c3 VARCHAR(288) DEFAULT (SESSION_USER()), -> c4 VARCHAR(288) DEFAULT (SYSTEM_USER()) -> ); Query OK, 0 rows affected (0.03 sec) (root@localhost) [test] 8.0.34 > select CURTIME(); +-----------+ | CURTIME() | +-----------+ | 16:54:46 | +-----------+ 1 row in set (0.00 sec) (root@localhost) [test] 8.0.34 > insert into t values(); Query OK, 1 row affected (0.01 sec) (root@localhost) [test] 8.0.34 > TABLE t; +----------------+----------------+----------------+----------------+ | c1 | c2 | c3 | c4 | +----------------+----------------+----------------+----------------+ | root@localhost | root@localhost | root@localhost | root@localhost | +----------------+----------------+----------------+----------------+ 1 row in set (0.00 sec)
一応、前のバージョンでもやってみる。
(root@localhost) [test] 8.0.33 > CREATE TABLE t ( -> c1 VARCHAR(288) DEFAULT (USER()), -> c2 VARCHAR(288) DEFAULT (CURRENT_USER()), -> c3 VARCHAR(288) DEFAULT (SESSION_USER()), -> c4 VARCHAR(288) DEFAULT (SYSTEM_USER()) -> ); ERROR 3770 (HY000): Default value expression of column 'c1' contains a disallowed function: user.
エラーになる。
気になったことを試してみるの巻
リリースノート見てたり使ってみたりしてて気になったことを2つを試してみた。
- 他の関数はデフォルトに対応している?
- デフォルト値としては使えなくてもINSERTすることはできる?
他の関数はデフォルトに対応している?
Q.USER周りの関数は対応したけど、そもそも現在の日付はデフォルト値できなかったけ?と疑問に思ったのでやってみた。
A.新しくUSER関数が対応しただけで他の関数は前から対応している。
MySQL :: MySQL 8.0 リファレンスマニュアル :: 12.1 SQL 関数および演算子リファレンス
CURTIME()
をデフォルトに設定してみる。
8.0.34は普通にできる。
(root@localhost) [test] 8.0.34 > CREATE TABLE t2 ( -> c1 VARCHAR(288) DEFAULT (CURTIME()) -> ); Query OK, 0 rows affected (0.06 sec) (root@localhost) [test] 8.0.34 > insert into t2 values(); Query OK, 1 row affected (0.00 sec) (root@localhost) [test] 8.0.34 > TABLE t2; +----------+ | c1 | +----------+ | 16:55:51 | +----------+ 1 row in set (0.00 sec)
8.0.33でも普通にできる。
(root@localhost) [test] 8.0.33 > CREATE TABLE t2 ( -> c1 VARCHAR(288) DEFAULT (CURTIME()) -> ); Query OK, 0 rows affected (0.03 sec) (root@localhost) [test] 8.0.33 > insert into t2 values(); Query OK, 1 row affected (0.01 sec) (root@localhost) [test] 8.0.33 > TABLE t2; +----------+ | c1 | +----------+ | 16:56:00 | +----------+ 1 row in set (0.00 sec)
デフォルト値としては使えなくてもINSERTすることはできる?
Q.デフォルト値に設定できるようになっただけで、前のバージョンでINSERTを使って入れようと思えばいけるのか?
A.普通にできた。
8.0.34でINSERTによって追加できた。
(root@localhost) [test] 8.0.34 > insert into t values(USER(),CURRENT_USER(),SESSION_USER(),SYSTEM_USER()); Query OK, 1 row affected (0.02 sec) (root@localhost) [test] 8.0.34 > TABLE t; +----------------+----------------+----------------+----------------+ | c1 | c2 | c3 | c4 | +----------------+----------------+----------------+----------------+ | root@localhost | root@localhost | root@localhost | root@localhost | | root@localhost | root@localhost | root@localhost | root@localhost | +----------------+----------------+----------------+----------------+ 2 rows in set (0.00 sec)
8.0.33もINSERTによって追加できた。
(root@localhost) [test] 8.0.33 > insert into t values(USER(),CURRENT_USER(),SESSION_USER(),SYSTEM_USER()); Query OK, 1 row affected (0.00 sec) (root@localhost) [test] 8.0.33 > TABLE t; +----------------+----------------+----------------+----------------+ | c1 | c2 | c3 | c4 | +----------------+----------------+----------------+----------------+ | root@localhost | root@localhost | root@localhost | root@localhost | +----------------+----------------+----------------+----------------+ 1 row in set (0.00 sec)
〆
いつ使うんだろう。
監査系で実行ユーザのログを残すときとかかな。