使用LINQ2SQL插入数据时是否有自动生成回滚脚本的方法?

时间:2010-04-23 10:00:42

标签: sql-server oracle linq-to-sql rollback

假设我们对给定的InsertOnSubmit有一堆LINQ2SQL 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语句。或者使用一些可以让我捕获事务并稍后执行回滚的功能。

我们不能只是将数据库“重置”到某个时间点,因为我们的程序之后的其他更改可能都不会发生。

3 个答案:

答案 0 :(得分:2)

实际上这很容易,因为你可以在构造时将SqlConnection传入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();
    }
}

答案 1 :(得分:1)

我总是需要向QA团队提供RollBack脚本进行测试,然后才能在PROD中执行任何更改脚本。

示例:文件在外部发送,我们,收件人和其他第三方之间有一堆映射。其中一个第三方希望在约定的日期改变我们三人之间的映射。

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

如果由于某种原因,在我们完成所有更改并且文件传输被启动之后,就像在UAT中一样,我们看到UAT中没有遇到一些错误,我们可能会多边决定回滚更改。因此回滚脚本。

当您使用BEGIN TRAN直到COMMIT TRAN或ROLLBACK TRAN时,SQL会显示此信息。我猜你的问题与我的问题相同 - 你可以将这些信息输出为剧本。

答案 2 :(得分:0)

你为什么需要这个?

也许您应该探索Oracle的闪回可能性。它可以回到过去。

它可以将表或数据库的内容重置为特定时刻(或特定系统更改号)的内容。

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