質問

による 保存されたルーチンとトリガーの制限, 、動的SQLは使用できません(バージョン5.0.13以降のストアドプロシージャのために制限を解除します)。なぜこの制限が整っているのですか?そして、なぜ手順のためにそれを持ち上げますが、関数やトリガーではないのですか?

役に立ちましたか?

解決

質問を聞いているだけで、2つの側面を思い浮かべます。

アスペクト#1:関数は決定論的であるはずです

これがそうである場合、これは、関数が関数を呼び出すときであっても、特定のパラメーターセットに対して同じ返品データを一貫して提示する必要があることを意味します。

ここで、関数の静的SQLに基づいて、1日の異なる時間にデータを収集するために異なる答えを生成する関数を想像してください。ある意味では、同じパラメーターのセットを与えられて、毎回同じテーブルと列のセットをクエリする場合、それはまだ決定論的と見なすことができます。

動的SQLを介して関数の基礎となるテーブルを変更できる場合はどうなりますか?決定論的機能の定義に違反しています。

mysqlが/etc/my.cnfにこのオプションを追加したことに注意してください

log-bin-trust-function-creators

これは単純化しすぎているかもしれませんが、これにより、決定論的プロパティを厳密に施行することなく、関数をバイナリログにデータの書き込みが許可することができます。

アスペクト#2:トリガーはロールバックできるはずです

  • 同じ動作が関数として、そして動的SQLをミックスに導入するトリガーを想像できますか?
  • 応募しようと想像できますか MVCC(多額の同意制御) MVCCをベーステーブルに適用した後の動的SQLに対して、トリガーは意図されていましたか?

本質的には、MVCCだけで(指数関数的に)(指数関数的に)成長するデータがあります。控えめに言っても、非決定的である可能性のあるトリガーを使用してSQLのロールバックを管理するプロセスは、不敬lyな複雑です。

これらの2つの側面に照らして、MySQL開発者はこれらのことを考え、制限を課すことですぐにそれらを却下しました。

では、なぜ手順の制限を解除するのですか?簡単に言えば、決定論的特性やロールバックについては懸念がありません。

他のヒント

これは素晴らしい質問ですが、答えはわかりません。これは国内チームを獲得する必要があると思いますが、彼らがこのサイトに大きくなることはわかりません。それまでの間、私はあなたがいくつかの答えを推測するのを手伝うことができます。

手始めに私はこれを見る:

トリガーキャッシュは、基礎となるオブジェクトのメタデータがいつ変更されたかを検出しません。トリガーがテーブルを使用し、トリガーがキャッシュにロードされてからテーブルが変更された場合、トリガーは時代遅れのメタデータを使用して動作します。

それは私がそれと関係があると思うようになります。メタデータを監視していない場合、SQLを再コンパイルすることはありません。つまり、エンジンの懸念事項です。

同様に、このブロックを読んだとき、私は同じこと(エンジン)だと思います:

サーバースレッド間の相互作用の問題を防ぐために、クライアントがステートメントを発行すると、サーバーはルーチンのスナップショットを使用し、ステートメントの実行に利用できるトリガーを使用します。つまり、サーバーは、ステートメントの実行中に使用される可能性のある手順、関数、およびトリガーのリストを計算し、それらをロードしてから、ステートメントの実行に進みます。これは、ステートメントが実行されている間、他のスレッドによって実行されるルーチンの変更が表示されないことを意味します。

全体として、なぜ彼らがそれを許可しないのか完全にはわかりませんが、推測できます。申し訳ありませんが、私はあなたをもっと助けることができないことを申し訳ありません。私たちがプライベートベータ版を離れたら、いくつかのアクティブなMySQL開発者に期待することが最善です;)

主に、それはセキュリティによるものです。手順の例外は、手順内の動的なSQLに実行されるユーザーのセキュリティコンテキストを割り当てることができるためです。これは、エンジンがわからないとしても、 実行される予定で、ユーザーが参照されるオブジェクトにアクセスできることを確認できます。

それを超えて、許容されていれば、何が起こるかという醜い問題を提起することができます。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top