Mysql 存储过程将太多记录从活动表移动到历史记录表

Mysql 存储过程将太多记录从活动表移动到历史记录表,mysql,powershell,Mysql,Powershell,我已经完成了一个将库存信息从PowerShell脚本输入数据库的过程 除了一件事,一切都进展顺利。每当运行脚本时,我都需要将一个表中的值复制到另一个历史记录表中,然后从第一个表中删除较旧的条目,以便它只包含通过PowerShell脚本进行的最新值扫描中的条目。但是当我执行它时,只有最后一个条目出现在第一个表中,其余所有条目都被发送回历史表。这是一个逻辑错误 请您纠正我的错误,以便在我运行脚本时,所有条目都出现在第一个表中,并且只有我上次运行脚本时的条目才会出现在另一个表中?或者我需要为它创建一个

我已经完成了一个将库存信息从PowerShell脚本输入数据库的过程

除了一件事,一切都进展顺利。每当运行脚本时,我都需要将一个表中的值复制到另一个历史记录表中,然后从第一个表中删除较旧的条目,以便它只包含通过PowerShell脚本进行的最新值扫描中的条目。但是当我执行它时,只有最后一个条目出现在第一个表中,其余所有条目都被发送回历史表。这是一个逻辑错误

请您纠正我的错误,以便在我运行脚本时,所有条目都出现在第一个表中,并且只有我上次运行脚本时的条目才会出现在另一个表中?或者我需要为它创建一个新的过程,在执行PowerShell循环之前只运行一次

存储过程:

分隔符$$ 删除过程(如果存在)`e_inv`.`insertvalue`$$ 创建过程插入值 在varchar255中的assetname_中, 在varchar255中的attributename_中, 在varchar255中的条目_中, 在val_IN int中, 在sc varchar255中, 在ip varchar255中 开始 声明temp_id INT; 声明临时id INT; 插入到属性值历史记录中 从属性值中选择*; 从属性_值中删除; 将u.u\u id选择到临时id中 来自用户\系统\地图 其中u.ip_add=ip; 选择一个.map\u id到temp\u id 从资产属性映射a a.asset\u id=b.asset\u id上的内部联接资源\u master b a.attribute\u id=c.attribute\u id上的内部连接属性\u master c 其中b.asset\u name=assetname\u in c.attributename=attributename\u in; 插入到属性值中 地图编号, 进入 你的身份证, 值_id, 扫描时间 价值观 临时工, 进入, 临时工id, 瓦卢因, 日期时间 ; 结束$$ 定界符; PowerShell代码:

cls $MySQLAdminUserName='root' $MySQLAdminPassword='root' $MySQLDatabase='e_inv' $MySQLHost='egovpc3' $ConnectionString=server=+$MySQLHost+;端口=3306;uid=+ $MySQLAdminUserName++;pwd=+$MySQLAdminPassword+ ;数据库=+$MySQLDatabase [void][System.Reflection.Assembly]::LoadWithPartialNameMySql.Data $Connection=新对象MySql.Data.MySqlClient.MySqlConnection $Connection.ConnectionString=$ConnectionString $Connection.Open $SqlCommand=新对象MySql.Data.MySqlClient.MySqlCommand $arr=获取内容-路径D:\Powershell\New Folder\a.txt foreach$comp,单位为$arr{ $ip=[System.Net.Dns]::GetHostAddresses$comp |选择$\uu0.ToString $count=0 $bios=gwmi Win32_用户帐户-计算机名$comp-身份验证包隐私 $date=获取日期-格式yyyy MM dd HH:MM:ss $date foreach$obj,单位为$bios{ $count=$count+1 $Manufacturer=$obj.Manufacturer $Name=$obj.Name $ReleaseDate=$obj.ConvertToDateTime$obj.ReleaseDate $SerialNumber=$obj.SerialNumber $Version=$obj.Version $date=获取日期-格式yyyy MM dd HH:MM:ss $date $SqlCommand.CommandText= 调用insertvalue'UserAccount'、'Name'、'$Name'、'$count'、'$date'、'$ip' $SqlCommand.Connection=$Connection $SqlCommand.ExecuteOnQuery } }
编辑:我还想知道,如果出现任何错误并且历史记录未保存,如何为此过程部署ROLLBACK语句。

活动表只保留最后一条记录,因为您在循环中多次调用存储过程,因此,每次所有当前存在的记录(包括在上一次迭代中添加的记录)都会移动到历史记录表中。因此,应该将存储过程分成两部分:一部分用于将现有记录移动到历史记录表中,在开始循环之前只调用一次,另一部分用于将新记录添加到在循环内调用的活动表中

至于回滚操作:您需要将语句封装在事务中:

... $Connection.Open $IsolationLevel=[System.Data.IsolationLevel]::ReadCommitted $Transaction=$Connection.BeginTransaction$IsolationLevel $SqlCommand=新对象MySql.Data.MySqlClient.MySqlCommand $SqlCommand.Connection=$Connection $SqlCommand.Transaction=$Transaction ... $SqlCommand.CommandText=。。。 $SqlCommand.ExecuteOnQuery ... $Transaction.Commit ... 要回滚事务,请使用$transaction.Rollback而不是$transaction.Commit,例如在异常处理程序中:

$ErrorActionPreference=停止 试一试{ $Transaction=$Connection.BeginTransaction$IsolationLevel ... $Transaction.Commit }抓住{ $Transaction.Rollback }