0

我被要求实现一些代码,这些代码将更新 MS SQL Server 数据库中的一行,然后使用存储过程将更新插入历史表中。我们无法添加存储过程来执行此操作,因为我们不控制数据库。我知道在存储过程中您可以进行更新,然后在另一个存储过程上调用执行。我可以使用一个 SQL 命令将其设置为在代码中执行此操作吗?

4

6 回答 6

1

要么在同一个语句中运行它们(用分号分隔单独的命令),要么使用事务,以便在第二个语句失败时回滚第一个语句。

于 2008-09-16T18:28:46.330 回答
1

你真的不需要为此存储过程。问题实际上归结为您是否可以控制所有插入。如果实际上您可以访问所有插入,您可以简单地将插入包装到数据表中,并在单个事务中将插入插入到历史表中。这将确保两者都完成以实现“成功”。但是,在事务中按顺序访问表时,您需要确保先不锁定历史表,然后再锁定数据表,否则可能会出现死锁情况。

但是,如果您无法控制插入,您可以向某些数据库系统添加触发器,以便您可以访问已修改、插入或删除的数据。它可能会或可能不会为您提供所需的所有数据,例如谁进行了插入、更新或删除,但它会告诉您发生了什么变化。

于 2008-09-16T18:29:11.290 回答
0

您还可以创建 sql 触发器。

于 2008-09-16T18:25:49.020 回答
0

根据您的库,您通常可以将两个查询放在一个命令字符串中,用分号分隔。

于 2008-09-16T18:26:09.160 回答
0

信息不足——什么SQL服务器?为什么要有历史表?

触发器会做这种事情。MySQL 的 binlog 可能对您更有用。

你说你不控制数据库。你控制访问它的代码吗?在此处添加日志记录并将其完全排除在 SQL 服务器之外。

于 2008-09-16T18:26:11.237 回答
0

谢谢大家的回复,下面是我最后做的一个概要。现在来测试一下,如果发生故障,trans 是否真的回滚。

sSQL = "BEGIN TRANSACTION;" & _
           " Update table set col1 = @col1, col2 = @col2" & _
           " where col3 = @col3 and " & _
           " EXECUTE addcontacthistoryentry @parm1, @parm2, @parm3, @parm4, @parm5, @parm6; " & _
           "COMMIT TRANSACTION;"
于 2008-09-16T19:10:17.917 回答