Yakstは、海外の役立つブログ記事などを人力で翻訳して公開するプロジェクトです。
約8年前投稿 修正あり

フィードバック求む: SQLモードの強制(MySQL Server Blogより)

MySQLにはSQLの様々な動作を制御するSQLモードという設定がある。本パラメータの歴史および、Todd Farmer氏によるこの機能の拡張の提案をご紹介する。 従来はユーザーが自由に値を選択可能であったが、サーバーコンフィグに--sql_modes_allowed、--sql_modes_requiredパラメータを追加することで許容する値、強制する値の設定を可能とする。

原文
Feedback Request: Enforcing SQL Mode | MySQL Server Blog (English)
翻訳依頼者
B5aa4f809000b9147289650532e83932
翻訳者
B5aa4f809000b9147289650532e83932 taka-h
翻訳レビュアー
D98ee74ffe0fafbdc83b23907dda3665 doublemarket
原著者への翻訳報告
未報告


免責事項

この記事はTodd Farmer氏によるMySQL Server Blogの投稿「Feedback Request: Enforcing SQL Mode」(2016/2/9)をユーザが翻訳したものであり、Oracle公式の文書ではありません。


MySQLサーバーには多岐にわたるSQLモードがあります。SQLモードは様々な動作を制御するもので、制御する動作は他のRDBMSの方言(ANSI_QUOTESPIPES_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の開発を管理する上での問題を解決するものかどうか、教えてください。 提案手法でこの分野のみなさんのニーズが解決されるのかどうか、あるいは、代わりのアイデアがあればそれについて教えてください。

※訳注: フィードバックやご意見については、元の記事のコメント欄などに書込んでみてください。

次の記事
6万ミリ秒でできるLinuxパフォーマンス分析
前の記事
CHECK制約をエミュレートする新旧の方法とドメイン (MySQL Server Blogより)

Feed small 記事フィード

新着記事Twitterアカウント