今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、MySQL 8.0.34で変更されたCURRENT_USER()について触ってみたの日。

目次

とある日

今さながら、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 TABLEALTER 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)

いつ使うんだろう。

監査系で実行ユーザのログを残すときとかかな。