我被要求实现一些代码,这些代码将更新MS SQL Server数据库中的行,然后使用存储过程将更新插入历史记录表中。我们无法添加存储过程来执行此操作,因为我们不控制数据库。我知道在存储过程中你可以进行更新,然后在另一个存储过程中调用execute。我可以使用一个SQL命令在代码中进行设置吗?
答案 0 :(得分:1)
在同一个语句中运行它们(用分号分隔单独的命令)或者使用事务,这样如果第二个语句失败,你可以回滚第一个语句。
答案 1 :(得分:1)
你真的不需要存储过程。问题实际上归结为您是否可以控制所有插入。如果实际上您可以访问所有插入,则可以简单地将插入包装到数据表中,并在单个transasction中插入历史记录表。这将确保两者都完成“成功”。但是,当在事务中按顺序访问表时,您需要确保不锁定历史记录然后数据表,否则可能会出现死锁情况。
但是,如果您无法控制插入,则可以向某些数据库系统添加触发器,以便您访问已修改,插入或删除的数据。它可能会也可能不会为您提供所需的所有数据,例如谁进行了插入,更新或删除,但它会告诉您更改的内容。
答案 2 :(得分:0)
您还可以创建sql触发器。
答案 3 :(得分:0)
根据您的库,您通常可以将两个查询放在一个命令字符串中,用分号分隔。
答案 4 :(得分:0)
信息不足 - 什么是SQL服务器?为什么有历史表?
触发器会做这种事情。 MySQL的binlog可能对你更有用。
你说你不控制数据库。你控制访问它的代码吗?在那里添加日志记录并将其完全保留在SQL服务器之外。
答案 5 :(得分: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;"