1

假设我们有一堆InsertOnSubmit针对给定DataContext. 如果SubmitChanges调用成功,有没有办法自动生成一个 SQL 命令列表(甚至 LINQ2SQL 语句),可以撤消以后提交的所有内容?这就像执行回滚,即使一切都按预期工作。

注意:目标数据库将是 Oracle 或 SQL Server,因此如果两个数据库都有特定的功能可以实现这一点,我也很乐意使用它。

澄清: 我不希望“回滚”在插入成功完成后自动发生。我希望能够在原始程序完成插入数据后最多 24 小时(例如)通过 DELETE(或其他方式)“撤消”INSERT 语句。我们可以忽略任何可能出现的参照完整性问题。

假设表 A 有两列:(Id自动生成的唯一 ID)和Value(字符串)

如果 LINQ2SQL 代码执行两次插入

 INSERT INTO Table A VALUES('a') // Creates new row with Id = 1
 INSERT INTO Table A VALUES('z') // Creates new row with Id = 2

<< time passes>>

在稍后的某个时候,我希望能够通过执行“撤消”它

 DELETE FROM A Where Id = 1
 DELETE FROM A Where Id = 2

或类似的东西。我希望能够生成与这些DELETE语句匹配的语句INSERT。或者使用一些可以让我捕获事务并稍后执行回滚的功能。

我们不能只是将数据库“重置”到某个时间点,因为其他不是由我们的程序发起的更改可能已经发生了。

4

3 回答 3

2

这样做实际上很容易,因为您可以在构建时将 aSqlConnection传入 LINQ to SQL DataContext。只需在事务中运行此连接并在完成后立即回滚该事务。

这是一个例子:

string output;

using (var connection = new SqlConnection("your conn.string"))
{
    connection.Open();
    using (var transaction = connection.StartTransaction())
    {
        using (var context = new YourDataContext(connection))
        {
            // This next line is needed in .NET 3.5.
            context.Transaction = transaction;

            var writer = new StringWriter();
            context.Log = writer;

            // *** Do your stuff here ***

            context.SubmitChanges();

            output = writer.ToString();
        }

        transaction.Rollback();
    }
}
于 2010-04-23T10:40:30.600 回答
1

在可以在 PROD 中执行任何更改脚本之前,我总是需要向我们的 QA 团队提供一个回滚脚本进行测试。

示例:文件通过我们、收件人和其他第三方之间的一堆映射发送到外部。这些第三方之一希望在约定的日期更改我们三个之间的映射。

Exec 脚本可能会更新一些现有的,删除一些现在多余的并插入一些新记录 - scope_identity 用于后续关系设置等。

如果由于某种原因,在我们全部执行了更改并且文件传输启动之后,就像在 UAT 中一样,我们看到一些 UAT 中没有遇到的错误,我们可能会多方地做出回滚更改的决定。因此回滚脚本。

SQL 在您开始 TRAN 时具有此信息,直到您提交 TRAN 或 ROLLBACK TRAN。我猜你的问题和我的一样——你能把这些信息输出为脚本吗?

于 2010-11-11T04:44:57.940 回答
0

你为什么需要这个?

也许您应该探索 Oracle 的闪回可能性。它使时光倒流成为可能。

它可以将表或数据库的内容重置为在特定时间(或特定系统更改号)之前的状态。

请参阅:http ://www.oracle.com/technology/deploy/availability/htdocs/Flashback_Overview.htm

于 2010-04-23T14:55:43.437 回答