問題タブ [audit-tables]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
2687 参照

sql-server-2008 - どのアプリケーションがいつ SQL テーブルに書き込んでいるかを調べる

どのアプリケーションがいつ書き込みを行っているかなどの情報を取得できる SQL テーブルを監査する方法はありますか?

ユーザーがここで使用しているアプリケーションはたくさんあります。私はそれぞれをくまなく調べましたが、SQL Server のこの 1 つのテーブルに書き込む場所を見つけることができませんでした。そして大事なテーブルです。

それは私を夢中にさせています。

0 投票する
3 に答える
1033 参照

sql - 同じテーブル内の SQL Server 監査データ

私が取り組んでいるプロジェクトでは、レコードにデジタルで「署名」する必要があり、その後、変更を加えると行の新しい「バージョン」が作成されます。「署名済み」レコードは、規制上の理由から変更できず、新しいバージョンを頻繁に変更するべきではありません。これまでは、メイン テーブルと同じスキーマで別のログ テーブルを作成し、誰がいつ変更したかを追跡するための追加の列を作成していました。

ただし、すべてのデータ (さまざまなバージョンを含む) が同じテーブルに配置される SharePoint でいくつかの作業を行った後、私は別のアプローチを考えました。同じテーブルで、バージョン番号を増やします。次に、バージョン番号を PK に追加します。

長所:

  • 実装は簡単です。「署名済み」行の更新ではなく挿入を実行する「更新の代わりに」トリガーを作成するだけです。トリガーで更新する IsCurrentVersion 列を簡単に追加できます。
  • 古いバージョンのクエリは簡単です。必要な ID を持つすべてのレコードを取得して、ユーザーがリストから選択できるようにするだけです。
  • トリガーは、署名されている場合に行を更新できないことを保証するため (規制および監査の目的で) 便利です。
  • テーブルに対するスキーマの変更は、ミラーの "ログ" テーブルに複製する必要はありません。

短所:

  • テーブル少し大きくなる可能性がありますが、ほとんどの場合、レコードは「署名」後に変更されません。クライアントは、現在の使用レベルで最大約 100,000 行/年と見積もっています。SQL Server は数億行を処理できるため、これはそれほど悪いことではないように思えます。
  • インデックス作成とパフォーマンスが問題になる可能性があります。SharePoint は tp_CalculatedVersion int を PK に追加します。計算された数値は常に最新バージョンの 0 です。同じことを行い、バージョン番号に基づいて計算できます。それはパフォーマンスに役立ちますか?
  • 最新バージョンを確実に取得するためにデータのクエリを実行する追加の手順がありますが、これは SP で処理できます。

  • このシナリオには他にどのような短所がありますか。私は何かが欠けていますか??

0 投票する
2 に答える
2620 参照

mysql - MySQLテーブルから同じIDの最新のタイムスタンプ付きレコードを取得する方法は?

重複の可能性:
列の最大値を持つ行を取得します

特定のタイムスタンプで人々と彼らが所有する株式数の監査テーブルがあります。特定の ID の最新のレコードを取得するにはどうすればよいですか?

mysql 監査テーブル

私の希望の出力:

私はこのようなことができます:

しかし、これにより、繰り返されている最新のレコードのみが得られます。この場合、ID は 1,2 であり、3 ではありません。サブクエリや一時テーブルを使用せずに、すべての ID の最新レコードのリストを取得するにはどうすればよいですか?

0 投票する
2 に答える
9838 参照

mysql - 監査テーブルによるデータ変更履歴: 変更のグループ化

ユーザーとグループを MySQL データベースに保存したいとします。それらは n:m の関係にあります。すべての変更を追跡するために、各テーブルには監査テーブル user_journal、group_journal、および user_group_journal があります。MySQLトリガーは、INSERTまたはUPDATEごとに現在のレコードをジャーナルテーブルにコピーします(アプリケーションユーザーがレコードを削除したという情報が必要になるため、DELETESはサポートされていません-削除の代わりにactive設定されるフラグがあります0)。

私の質問/問題は次のとおりです。一度に 10 人のユーザーをグループに追加すると仮定します。後でアプリケーションのユーザー インターフェイスでそのグループの履歴をクリックするときに、これらの 10 人のユーザーの追加を10 の独立したステップとしてではなく、1 つのステップとして表示したいと考えています。そのような変更をグループ化するための良い解決策はありますか? トリガーがトリガーされるたびにインクリメントされるカウンターを持つことは可能でしょうか?トリガーを使用したことはありません。

最善の解決策は、トランザクション内で行われたすべての変更をまとめることです。したがって、ユーザーがグループの名前を更新し、1 つのステップ (1 つのフォーム コントローラー呼び出し) で 10 人のユーザーを追加すると、これは履歴の 1 つのステップになります。トランザクションが開始されるたびにランダム ハッシュを定義したり、グローバル カウンターをインクリメントしたりして、トリガーでこの値にアクセスすることは可能でしょうか?

「実際の」テーブルごとに 1 つのジャーナル テーブルを作成するよりも、テーブルの設計を複雑にしたくありません。各データベース テーブルにトランザクション ハッシュを追加したくありません (監査テーブルではなく、「実際の」テーブルを意味します。もちろん問題ありません)。また、アプリケーションではなく、データベースでソリューションを提供したいと考えています。

0 投票する
1 に答える
2114 参照

sql - 監査ログ テーブルから値への変更のみを選択する

MS SQL Server 2008 R2 にはテーブル Foo があり、Foo の挿入と更新のたびに、日付、ユーザー、PK FooId、および 1 つの数値を含む Foo の他のいくつかの列も FooAuditLog に挿入します。それをcxpと呼びます。

ここで、特定の FooId の cxp に対する経時的な変更履歴を取得する必要があります。しかし、cxp を変更せずに Foo を保存することは可能であり、それらの値を無視する必要があります。

たとえば、特定の Foo (つまりselect date, user, cxp from FooAuditLog where fooId=17) の監査ログ エントリが次のようになっているとします。

次に、次のみを返すようにクエリを変更する必要があります。

11/7、11/9、11/14 のエントリは無視してください。を検討しましたselect distinct (cpx) ... group by dateが、値が以前の値に戻るエントリをキャプチャする必要があります。

0 投票する
3 に答える
389 参照

ruby-on-rails - レールモデルのシャドーテーブル

Railsアプリにフォローモデルがあり、ユーザーがコンテンツをフォローすると、レコードが作成され、フォローが解除され、レコードが削除されます。

この変更を別のテーブルで追跡する必要があります (挿入と削除のみ)。

プレーン SQL を使用していくつかのレポートを作成するために使用されます。そのため、テーブルは「シャドウ」とも呼ばれる同様の構造を持つ必要があります。

元のモデルを追加のロジックで汚染したくありません-いくつかの解決策がありますが、十分に柔軟ではありません:

https://github.com/rubiety/has_draft - 特定の操作を選択できない

https://github.com/bglusman/ruby-shadow-tables - raw および mysql のみ

そのような場合の良い解決策を知っている人はいますか?

0 投票する
1 に答える
997 参照

java - 既存のデータベース トリガーを使用した JPA 監査/履歴データ

多くの既存のアプリケーション (MS Access、Delphi、Perl、C#、PHP などで記述) の複雑なシステムに JPA アプリケーションを追加しています。基礎となる MS-SQL データベースは、データベース トリガーを使用して、変更されたデータベース エントリのコピーを履歴データベース テーブルに書き込み、 と を追加SYSTEM_USERGETDATE()ます。

私の新しいJPAアプリケーションは接続プールを使用しているため、データベーステーブルのすべての変更は常にテクニカルユーザー(ユーザー:「Java」)によって行われ、JPAアプリケーションのすべての履歴データベーステーブルエントリには常にSYSTEM_USERとして「Java」が含まれます。

既存のトリガーを削除せずに、履歴テーブルにエントリを自動的に作成する方法は?

私は考えました:

  1. ユーザー「Java」がテーブルを変更し、自分で履歴データベーステーブルエントリを作成するたびに、既存のトリガーを開始しないように指示します。したがって、履歴データベース テーブルごとに新しいエンティティ クラスを多数作成する必要がありました。あまり便利ではありません。
  2. 接続プールを無効にし、変更ごとに個別の接続を作成します - 実際のユーザーを使用してデータベースに接続します。しかし、これにはパフォーマンス上の欠点があります。また、接続プールを無効にする方法がわかりません。
  3. 一時テーブルを使用して常に現在のユーザーを保存します - データベーストリガーは、履歴データベーステーブルにエントリを作成するときに、その保存されたユーザーを使用する必要があります
  4. 操作後に履歴データベース テーブル内のユーザーを手動で変更します。
0 投票する
1 に答える
79 参照

mysql - mysql テーブルの列レベルの変更を記録する

私のクライアントは、監査を列レベルで維持したいと考えています。彼は、すべての監査を列レベルで格納するテーブルが必要です。テーブル構造を決めました。すなわち

しかし、各列レベルの変更をどのように確認するのか疑問に思っていました。old.columnname <> new.columnname のように手動でそれぞれをチェックしてから、監査テーブルに追加する必要がありますか?

それを行う他の方法はありますか?