假设我们对给定的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
语句。或者使用一些可以让我捕获事务并稍后执行回滚的功能。
我们不能只是将数据库“重置”到某个时间点,因为我们的程序之后的其他更改可能都不会发生。
答案 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