4

既存のWebアプリケーションで監査証跡を作成するための設計段階です。アプリケーションはWindows Azure上で動作し、SQL Azureデータベースを使用します。Azureに監査データを格納する方法

監査ログは、ユーザー、オブジェクトタイプ(ユーザーのすべてのアクションを表示する、オブジェクトで実行されるすべてのアクションを表示するなど)でフィルタリングする必要があります。

SQL Azureを使用する場合は、データの格納方法を選択する必要がありますか、テーブルストレージを使用する必要がありますか?

しかし、テーブルストレージの「問題」はパーティションキーを定義する方法です。私たちには、数千人の顧客(アプリケーションユーザー)がそれぞれのテナントのSQLデータベースにあります。テナントIDをパーティションキーとして使用するだけでは不十分なので、パーティションキーに何かを追加する必要があります。だから問題があります:フィルタリングのために、パーティションキーにユーザIDを追加してユーザによるフィルタリングを簡単にするか、オブジェクトIDを追加してオブジェクトによるフィルタリングを容易にすることができます。

だから我々は2つの解決策を参照してください。
を - 代わりに、テーブル記憶
のSQL Azureのを使用する - 何私たちは、すべてのエントリ

任意のアイデアを複製する意味し、テーブルのストレージを使用し、異なるパーティション・キーを持つ2つのテーブルを使用私たちの状況に最善のアプローチ?他にも優れたソリューションがありますか?

+0

DDL、DMLなどのSQLデータベースアクティビティやユーザー操作全体を監査しようとしています – TheGameiswar

+0

特定のイベント(CRUD操作)を保存したい場合、これらのイベントはSQLデータだけでなく、 – Hanno

+0

すべての監査 "レコード"がテーブルストレージ(1 MB)のサイズ基準に適合する場合、私はそれがほとんど好みであり、どのようにそれらにアクセスできるようにしたいと思います。チームがSQL/SQL Serverに精通しており、[テーブルストレージの並行性](https://azure.microsoft.com/en-us/documentation/articles/storage-concurrency)の処理を念頭に置いていれば、私は個人的にSQL Azureに行きます。 /#管理 - テーブルサービス内の同時実行) –

答えて

1

AzureのDocumentDBを検討する価値があります。 https://azure.microsoft.com/en-us/documentation/articles/documentdb-use-cases/あなたは、監査証跡がJSONドキュメントとしてDOCDBに保存されていることができます(ユーザー、アクティビティ、オブジェクトフィールドとすべてのフィールドにインデックスすることができます)

+0

提案をお寄せいただきありがとうございます。このアプローチをさらに調査します – Hanno

+0

DocumentDB – Hanno

0

Azureテーブルストレージが適切であるが、ログデータを保存するために 。 Azure AppサービスはAzure Table Storageを使用して診断ログを保存します。

PartitionKeyをユーザーのテナント名に設定し、RowKeyをユーザーのIDに設定することを検討してください。 Table Storage Data Modelに従ってとして、私たちは維持する必要があります:一緒に

PartitionKeyRowKeyは一意にあなたはについてのあなたの懸念を明確することができ、

また、テーブル内のすべてのエンティティを識別する:

をテナントIDをパーティションキーとして使用するだけでは不十分なので、パーティションキーに何かを追加する必要があります

さらに、Azureテーブルのデザインに関する詳細については、https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/#overviewを参照してください。

最新の情報は、お気軽にお知らせください。

+0

を使用することにしたため、答えとしてマークされている可能性があります。パーティションキーにはテナントIDを使用し、行キーにはユーザーIDを使用します。ユーザーごとに1つのレコードしか保存できません。ユーザーごとに多くのレコード(基本的にユーザーが実行するすべてのアクション)を保存する必要がありますが、これはうまくいかないでしょうか? – Hanno

+0

はい、あなたは正しいです。パーティションキーにはテナントID(名前)、カスタムキーにはユーザーIDを使用できます。また、ログエンティティIDの行キーとして 'uuid'を生成できます。 –

0

複数の方法でフィルタリングすることを心配している場合は、いつでも同じデータを複数のパーティションに書き込むことができます。それは本当にうまくいく。たとえば、私たちのアプリでは、スタッフと顧客がいます。双方に適用されたトラッキング/トレースを行うインタラクションがある場合(おそらく電話による購入)、私たちは監査テーブルに同じ情報(通常はjsonと同じ)を書きます。

{ 
    PurchaseId: 9485, 
    CustomerId: 138, 
    StaffId: 509, 
    ProductId: 707958, 
    Quantity: 20 
    Price: 31.99, 
    Date: '2017-08-15 15:48:39' 
} 

そして、我々は次のパーティションに同じ行を書き込みます:Product_707958Customer_138Staff_509。行キーは、各パーティションの3つの行で同じです(Purchase_9485)。今私が行って、特定のスタッフ、顧客、またはアイテムのために起こったすべてを照会したい場合、私はただパーティション全体をつかみます。ストレージは安いので、複数の場所に書き込むと誰が気になりますか?

また、テナントが複数あると考えると、テーブル名をTenant_[SomeId]にすることができます。他にもいくつか対処しなければならない問題がありますが、それはスキーマレスのデータを取得するもう1つの鍵です。

関連する問題