sql >> データベース >  >> RDS >> Mysql

これは、監査証跡を作成するための最良のアプローチですか?

    「最善のアプローチ」が1つあるかどうかはわかりません。開発パスのどこまで進んでいるかなど、考慮すべき変数はたくさんあります。

    コードベースの監査ソリューションとdbトリガー監査ソリューションの両方を経験したので、以下にいくつかのコメントをリストしました。現在の状況(開発の観点から)がこれらの問題に影響を与える可能性があることをご理解いただければ幸いです。

    • データを変更したユーザーをマップする必要がある場合(通常はこれを行います)、dbトリガーは何らかの方法でこの情報を取得する必要があります。不可能ではありませんが、これに取り組むためのより多くの作業といくつかの方法(dbユーザーがクエリを実行する、各テーブルの共通ユーザー列など)
    • dbトリガーを使用し、クエリから返される影響を受ける行数に依存する場合は、監査トリガーでこれをオフにするか、既存のコードを変更してそれらを考慮に入れる必要があります。
    • IMHO dbトリガーは、より高いセキュリティを提供し、監査自動化へのより簡単なパスを提供しますが、適切なアクセス権を持つ誰もがトリガーを無効にし、データを変更してから再度有効にすることができるため、絶対確実ではありません。つまり、データベースのセキュリティアクセス権が厳しくなっていることを確認してください。
    • 履歴用に単一のテーブルを用意することは悪い方法ではありませんが、複数のテーブルの履歴を監査する場合、特に監査証跡の再構築に関しては、より多くの作業(および保存するデータ)が必要になります。 1つの監査テーブルに書き込もうとしているテーブルが多数ある場合は、ロックの問題も考慮する必要があります。
    • テーブルごとに監査履歴テーブルを用意することも別のオプションです。監査テーブルの各列をnull許容にする必要があります。また、アクションの日時(挿入/更新/削除)とアクションに関連付けられたユーザーを保存する必要があります。
    • 単一テーブルオプションを使用する場合は、これに多くの時間を費やす時間がない限り、挿入を避けたくなるかもしれませんが、更新または削除のみを監査しようと気にしないでください(ほとんどの場合アプリは更新や削除よりも頻繁にこれを行います)、監査履歴の再構築にはかなりの作業が必要です。
    • サーバーまたはデータが複数のタイムゾーンにまたがっている場合は、適切な日時タイプを使用してタイムラインを保存および再構築できるようにすることを検討してください。つまり、監査イベントの日付をUTCで保存し、タイムゾーンのオフセットを含めることができます。
    • これらの監査テーブルは巨大になる可能性があるため、パフォーマンスに影響を及ぼし始めた場合は戦略を立ててください。オプションには、さまざまなディスクへのテーブルのパーティション分割、アーカイブなどが含まれます。基本的に、問題が発生したときではなく、今これについて考えてください:)


    1. SQLコマンドINSERTは機能していますが、データがテーブルに表示されません

    2. Railsレポートはそこにある列を見つけることができません

    3. group-concat mysqlを使用してjson形式を作成するにはどうすればよいですか?

    4. スカラー変数@Idを宣言する必要がありますか?