免責事項
この記事はTodd Farmer氏によるMySQL Server Blogの投稿「Feedback Request: Enforcing SQL Mode」(2016/2/9)をユーザが翻訳したものであり、Oracle公式の文書ではありません。
MySQLサーバーには多岐にわたるSQLモードがあります。SQLモードは様々な動作を制御するもので、制御する動作は他のRDBMSの方言(ANSI_QUOTES、PIPES_AS_CONCAT)との互換性から、セキュリティー(NO_AUTO_CREATE_USER)、明示的なストレージエンジンの選択(NO_ENGINE_SUBSTITUTION)、ロスのある暗黙のデータ型変換の制限(STRICT_TRANS_TABLESなど)にわたります。これらのSQLモードによりユーザーが様々な方法で挙動をカスタマイズできるようになりますが、全ての場合で共通の問題に悩まされることになります。すなわちユーザー自身がどれを選択できるか、を制限する仕組みがないことです。どのユーザーも、データの質に影響を与えたり、不適切なストレージエンジンの選択したり、あるいは意図せずセキュリティーを弱体化させるものですら選択することができます。柔軟性はこの分野でMySQLの重要な特徴ではありますが、管理者が組織の要求を満たすためにこれらの選択肢を制限できるようにする追加の制御方法が必要です。
このブログ投稿ではSQLモードに加えられた最近の変更を振り返り、この分野での拡張について提案をおこない、提案の有用性とユーザービリティー、あるいは代替手段に対するフィードバックを募集したいと思います。
SQLモード: 歴史を簡単に振り返る
SQLモードはMySQLの挙動をユーザーが自身のニーズに合わせて調整する手段として導入されました。すなわち、他のRDBMSの他の構文に馴染みがある人々がMySQLでそれと似た構文を使えるようにする、日付や数値型に範囲外の値を許容するMySQLの方針を好まない人がこの挙動を制限できるようにする、セキュリティー意識の高い管理者がGRANTコマンドをミスタイプすることでパスワードのないユーザーアカウントが意図せず作成されることを防ぐ、などです。MySQLのデフォルト挙動の多くはとても寛容(permissive)です。つまり、もっと制限して利用したいユーザーは明示的にSQLモードを指定する必要があります。この考え方は、MySQL 5.6とMySQL 5.7のリリース間で変わり始め、MySQL 5.7ではデフォルトの挙動をRDBMSの標準に合わせる重要な変更を行っています。
MySQL 5.1およびそれ以前では、デフォルトのSQLモードの設定はありませんでした。MySQL 5.6でNO_ENGINE_SUBSTITUTIONとなり、MySQL 5.7では次の値をデフォルトとしています。
- ONLY_FULL_GROUP_BY
- STRICT_TRANS_TABLES
- NO_ZERO_IN_DATE
- NO_ZERO_DATE
- ERROR_FOR_DIVISION_BY_ZERO
- NO_AUTO_CREATE_USER
- NO_ENGINE_SUBSTITUTION
これによりデフォルトでより標準に準拠したものとなりますが、一方で従来との互換を望むユーザーに対しても柔軟性があります。
提案: AllowedとRequired SQLモード
問題となりうるSQLモードの設定を管理者が制限できるようにするために、新しく2つのサーバーコンフィグオプションを提案しています。--sql_modes_allowedと--sql_modes_requiredです。 これらのオプションと共に利用することで、データベース管理者は問題のあるSQLモードを制限(--sql_modes_allowed)しながら、全てのユーザーに特定のSQLモードの利用を強制(--sql_modes_required)することができます。--sql_modes_allowedに値を設定しない場合は、どのユーザーも全てのSQLモードが利用でき(従来の挙動)、--sql_modes_requiredに値を設定しない場合は必須となるSQLモードがない(従来の挙動と一貫性あり)ことを意味します。
一貫性を保証するために、いかなるときでも次のエラーを発生させます。
- --sql_modeに--sql_modes_requiredに含まれる全ての値が含まれなかったとき
- --sql_modeに--sql_modes_allowedに含まれない値がみつかったとき(--sql_modes_allowedが空の場合は除く)
- --sql_modes_requiredと--sql_modes_allowedが共に空でないときに、--sql_modes_requiredに--sql_modes_allowedにない値がみつかったとき
--sql_modeが必要なSQLモードであり、許可されたモード(定義されていれば)であることを保証することで、新しいコネクションはSQLモードにおいて組織のポリシを満たすでしょう。
フィードバック求む
SQLモードの制限がMySQLの開発を管理する上での問題を解決するものかどうか、教えてください。 提案手法でこの分野のみなさんのニーズが解決されるのかどうか、あるいは、代わりのアイデアがあればそれについて教えてください。
※訳注: フィードバックやご意見については、元の記事のコメント欄などに書込んでみてください。