歴史のテーブルプ,デー gotchasを用いたトリガー、sprocまたはアプリケーション-レベルで[定休日]

StackOverflow https://stackoverflow.com/questions/1250507

質問

私は現在、遊んでやらせようという考えには歴史のテーブルのための私のテーブルのデータベース.基本的には私のメインテーブルのコピーがテーブルに変更時刻、行列店うした事柄は例-更新-削除をサポートしていません。

これまでにして私が考えられることはいろんの歴史をテーブルです。

  • トリガーのトラスト-ホールディングスのため、更新、挿入、削除します。(データベース)
  • 保存。(データベース)
  • アプリケーション層.(アプリケーション)

私の主な問題は、どのようにプ,デー gotchasのこの仕事をやってきて、これらの各層です。

一部を、私はを考えることができるようにトリガーがその完全性を保証するものではあとも、どんなプログラムはimplmentatedのデータベースです。

役に立ちましたか?

解決

今ここの

  • 保存procs: 彼らは素通り(バイパス)に変更があった場合には、テーブル。におけるセキュリティに対してデータベースを制御できるこ
  • 申し込み: じます。また複数の用途が異なる言語で実施する各スタックや冗長;や
  • トリガー: 透明の発生をアプリケーションを獲得すべての変わります。これが私の優先出方法。

他のヒント

トリガーは、簡単な歴史を達成するための最速かつ最も簡単な方法です。以下の情報は、履歴処理は、いくつかのビジネスルールを含むことができ、追跡されるテーブル内に見つからないログ情報を必要とするかもしれない、より複雑な例を想定しています。

彼らは私が彼らには、以下の仮定を作っていること、それらを思い出させるバイパスすることができないので、トリガーはストアドプロシージャよりも安全であることを考えるものにます:

)パーミッションつまりDISABLE TRIGGERを実行することからユーザーを停止存在【その後権限があまりにもエンタープライズ・アプリケーションのための共通のパターンであるストアドプロシージャのEXECUTEを除き、データベースへのすべてのアクセスを制限するために存在し得る] - したがって、一方が正しい権限を想定しなければならず、したがって、セキュリティとバイパスされる能力の点で同じトリガーをストアドプロシージャ

!)データベースに依存して、トリガを起動していない更新ステートメントを実行することも可能です。私はトリガーをバイパスするために、ネストされたトリガの実行深さの知識を活用することができます。これらは、トリガ、ストアドプロシージャまたはデータアクセス層であろうと、

- 唯一の確実ソリューションは、データベースのセキュリティと唯一承認メカニズムを使用してデータへのアクセスを制限しています。

私は選択肢がここで明確にしていると思います。データは、複数のアプリケーションによってアクセスされているなら、あなたは最低の共通の層からの歴史をコントロールしたい、これはデータベースを意味します。

上記論理後、トリガーまたはストアドプロシージャの選択は、ストアドプロシージャが最も低い共通の層であるかに再び依存します。あなたは、パフォーマンスを制御することができますよう、トリガーを超えるSPROCを好む、より良い副作用とコードは保守が容易である必要があります。

トリガーは許容されていますが、更新されたテーブルの外にデータを読み出すことによりロックを増加させないことを確認してみてください。制限は、あなたがする必要がある唯一のものをログ、ログテーブルに挿入するトリガ。

アプリケーションは、共通の論理アクセス層を使用し、私がここにロジックを実装することを好む時間の経過とともに変化するとは考えにくい場合。責任のパターンとプラグインアーキテクチャの連鎖を使用して、あなたのことをあなたにすべての処理方法を可能にするために依存性の注入からの技術の伐採に完全に異なる種類、異なるデータベース、履歴サービスまたは何か他のものを含む、履歴モジュールを、このドライブ想像ます。

てのトリガーに基づくアプローチのための年となったものの、その後いては、以下の点について沈思黙考する:

  1. ガすく使用される(たとえば、マルチテナントのSaaS利用できる非常に高価なもので

  2. 一部のシナリオは、別の複数分野での冗長となります。トリガーとしての良いるときに限り明確に分野へのログインできま;ものを使用したいアプリケーションがインタセプタの層で、このログインする分野の"設定";もとでのシェアオーバーヘッド

  3. 十分なデータベース管理者が簡単に無効にするトリガーを変更するか、データをトリガ;すべてを上昇させることなく任意のアラーム

  4. の場合はwebアプリケーションに接続して位置付けられており、プール、トラッキング、実際のユーザーに変更する場合は面倒なのです。を解いて、"EditedBy分野"では、全ての取引ます。

遅いつでも追加しカップルにオプションが考えられる。

変更データ取得: この 機能は、SQL Server2008R2+に限enterprise editionのライセンスを含みます。で選択できるテーブルにしたいトラック、SQLサーバーにしかできない仕事します。この作品の読みの取引ログ-populating歴史をテーブルデータです。

読みトランザクションログ: 場合データベースは完全に回復モードに設定して取引履歴について管理することができ読みの詳細はほとんど取引を見つけることができます。

下振れすることによってサポートされていないデフォルトです。オプションを読み取引のログ用の非正規滞在機能fn_dblogまたは第三者ツールなど ApexSQL Log.

トリガー: 作品は、イブレア城、イブレア少数のテーブルが多くないトリガーを管理いたします。また多くのテーブルしたいの監査にその考えの一部を第三者ツールです。

すべてのこれらの作品データベースレベルでは、完全に透明です。

トリガーは変更を取得するための唯一の信頼できる方法です。あなたがストアド手続きオブジェクトまたはアプリケーションでそれを行う場合、あなたは常にで行くとSQL離れてあなたが(うっかり)のログを持っていない変更をすることができます。もちろん、トリガを無効にすることができ、ログを残すことを望んでいない誰か。しかし、あなたはむしろ、彼らはそれを含めることを忘れないでくださいことを願っていますよりも、ログを無効にするために誰かを強制思います。

あなたは、アプリケーション層を選択した場合、

通常、あなたはconsistenlyすべてのあなたの歴史のテーブルを処理する単一のポイント、中にロギングを行うにはアプリのコードを設計することができます。彼らは(デシベルの技術に応じて)されているため、異なるトリガは維持するために、より複雑なアプローチあるすべてのテーブルについて複製:テーブルの百の場合には、トリガーのコードの量が問題になることcoud。

あなたが今書いているコードを維持するサポート組織を持っており、あなたのコード(ビッグ産業用tipical)を維持するか分からない場合は、

あなたがやるだろう、人のスキルレベルであると仮定することはできませんできるだけ簡単に原理を働く歴史の表を作るために私の意見では優れている、とアプリケーション層は、おそらく、この目的のために最高の場所である場合には、アプリケーションに修正します。

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