【问题标题】:EventStore 3.1 - SQL Persistence - How can I use a non-dbo schema?EventStore 3.1 - SQL Persistence - 如何使用非 dbo 模式?
【发布时间】:2011-12-12 22:17:23
【问题描述】:

对于我正在进行的项目,我无法使用 [dbo] 架构。从 EventStore 源代码来看,使用非 dbo 模式看起来并不简单。

到目前为止,我想到的最好的方法是使用这样的自定义方言:

  • CommonSqlDialect 子类
  • 添加 MsSqlDialect 的私有实例
  • 然后覆盖 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(...)

有没有明显更好的方法来处理我错过的这个问题?

【问题讨论】:

    标签: event-sourcing event-stream neventstore


    【解决方案1】:

    虽然我可以看到可能需要自定义表名,但现有版本不支持。您需要做的就是将 MsSqlDialect 子类化,然后将您的自定义版本提供给wireup,如下所示:

    UsingSqlPersistence(...)
        .WithDialect(new MsSqlDialectWithCustomTableNames());
    

    【讨论】:

      【解决方案2】:

      不需要任何代码更改且有利于安全的解决方案:

      1. 在数据库中创建一个新用户,并授予他对新架构的只读/写入权限。
      2. 将新架构设置为用户的默认架构。
      3. 将新的“EventStore”连接字符串添加到配置文件中。
      4. 将此新连接传递给UsingSqlPersistence 构造函数。

      事件存储中的所有查询以架构名称为前缀,因此更改用户的默认架构有效地将所有调用“重定向”到新架构。

      更重要的是,拥有有限权限的事件存储的特定用户无论如何都是一件好事。确保其他数据库用户无权访问您的新架构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-24
        • 1970-01-01
        • 1970-01-01
        • 2014-10-06
        • 1970-01-01
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多