1

私が取り組んでいるプロジェクトでは、[dbo] スキーマを使用できません。EventStore ソースを見ると、非 dbo スキーマを使用するのは簡単ではないように見えます。

これまでのところ、私が思いついた最善の方法は、次のようなカスタム方言を使用することです。

  • サブクラス CommonSqlDialect
  • Msqldialect のプライベート インスタンスを追加します。
  • 次に、 CommonSqlDialect のすべての仮想プロパティをオーバーライドして、次のようなことを行います

例:

public override string AppendSnapshotToCommit
{
    get { return customizeSchema(_msSqlDialect.AppendSnapshotToCommit); }
}
private string customizeSchema(string dboStatement)
{
    // replace "[dbo]" with "[notdbo]", 
    // replace " Commits" with " [notdbo].Commits", 
    // replace " Snapshots" with " [notdbo].Snapshots"
}

また、InitializeStorage プロパティをカスタマイズして "sysobjects" を "sys.objects" に置き換える必要があるため、スキーマ名に制約を追加できます。

これは機能しますが、スキーマとテーブル名をカスタマイズするためのワイヤアップ オプションが必要なようです。

UsingSqlPersistence(...)
    .WithSchema(...)
    .WithCommitsTable(...)
    .WithSnapshotsTable(...)

私が見逃したこれを処理するための明らかに良い方法はありますか?

4

2 に答える 2

3

テーブル名をカスタマイズする必要がある可能性はあると思いますが、既存のバージョンはそれをサポートしていません。MsSqlDialect をサブクラス化し、次のようにカスタム バージョンをワイヤアップに提供するだけです。

UsingSqlPersistence(...)
    .WithDialect(new MsSqlDialectWithCustomTableNames());
于 2011-12-14T02:10:34.520 に答える
1

コードの変更を必要とせず、セキュリティに適したソリューション:

  1. データベースに新しいユーザーを作成し、新しいスキーマへの読み取り/書き込みアクセスのみを許可します。
  2. 新しいスキーマをデフォルトのスキーマとしてユーザーに設定します。
  3. 新しい 'EventStore' 接続文字列を構成ファイルに追加します。
  4. UsingSqlPersistenceこの新しい接続をコンストラクターに渡します。

イベント ストア内のすべてのクエリにはスキーマ名のプレフィックスが付いていないため、ユーザーの既定のスキーマを変更すると、すべての呼び出しが新しいスキーマに効果的に「リダイレクト」されます。

さらに、権限が制限されたイベント ストア用の特定のユーザーを持つことは、とにかく良いことです。他のデータベース ユーザーが新しいスキーマにアクセスできないようにしてください。

于 2012-11-14T08:00:07.577 に答える