はい、行動を依存させることは常に悪いことです pg_trigger_depth()
たぶん私は毛布の発言を少し嫌っていますが、それで何ができるでしょうか なぜそのような機能が必要なのかについて、私が理解できる議論はありません。データベースの主な目的は、データの整合性を確保することです。そして、私の知る限り、私は間違っている可能性があり、そのような使用は常に ある潜在的なデータ整合性の違反。@アーウィンの答えで彼は「もしあなたが忘れたら」と言います。整合性を確保するポイントは、その可能性を排除することです。エージェントがすべてを覚えていて、結果とその周りのコードを理解できれば、何からでもデータの整合性を得ることができます。
いくつかの用語を紹介しましょう。プログラミングでは、
- プログラマがアクセスできるすべてのものを含む「状態」。
- 実行環境を含む「実行コンテキスト」。
さらに、関数の用語があり、純粋な関数と呼ぶ状態はありません 。
関数は常に、同じ引数値が与えられた場合、同じ結果値を評価します。関数の結果の値は、プログラムの実行中またはプログラムの異なる実行間で変化する可能性のある非表示の情報や状態に依存したり、I / Oデバイスからの外部入力に依存したりすることはできません(通常、以下を参照)。
純度のための区別は、それは、コンピュータ、またはプログラマの代わりに何かを覚えて任意の負担がなくなるために有用である:f(x) = y
ある常に真。ここで、最悪の場所であるデータベースに純粋性を違反しています。そして、あなたはそれを複雑でエラーが発生しやすい方法で行っています-DBアプリケーションの状態で内部実行コンテキストを明白なものにします。
それは欲しくない。精神的に緩衝しなければならない複雑さを考慮してください。
Table A
のTrigger A
火災
Trigger A
いつものDMLを発行Table B
発射、Trigger B
。
Trigger B
条件付きにDMLを発行Table A
発射、Trigger A
。
Trigger B
いつものDMLを発行Table A
発射、Trigger A
。
Trigger A
条件付きにDMLを発行Table B
発射、Trigger B
。
Trigger B
条件付きにDMLを発行Table A
発射、Trigger A
。
Trigger B
いつものDMLを発行Table A
発射、Trigger A
。
それが複雑に見える場合は、「条件付きで」、「発生したが、常に発生するとは限らない」、「発生しなかったが、他の場所で発生する可能性がある」とさらに拡張できることに注意してください。
pg_trigger_depth()
役立つためにも、同様に複雑な一連のイベントが必要です。そして今、あなたは実行がそのチェーンの実行内容に依存することを望みますか?
私はこれを避けます。トリガーシステムがこのように複雑な場合、手榴弾を使ってクローゼットの中でホットポテトを一人で遊んでいるため、うまく終了しないようです。