Triggers 无法单独更新行

Triggers 无法单独更新行,triggers,sql-server-2008-r2,sql-update,Triggers,Sql Server 2008 R2,Sql Update,我正在尝试在系统内更新我们的患者表,但由于我们与将对该表的修改发送到外部系统的状态的连接,由于系统中存在多个触发器(Microsoft SQL Server 2008 R2),我无法进行大规模更新。触发器中阻止 IF (@numrows > 1) BEGIN IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION SELECT @errmsg = OBJECT_NAME(@@PROCID) + ' : more than one row is

我正在尝试在系统内更新我们的患者表,但由于我们与将对该表的修改发送到外部系统的状态的连接,由于系统中存在多个触发器(Microsoft SQL Server 2008 R2),我无法进行大规模更新。触发器中阻止

IF (@numrows > 1) 
BEGIN
    IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION
    SELECT @errmsg = OBJECT_NAME(@@PROCID) + ' : more than one row is updated in table Patient'                                 
    RAISERROR(@errmsg,16,21) 
    RETURN
END
我不能简单地关闭这些触发器,因为它会破坏很多东西,所以要做一件简单的事情

update patient set security_level = '2'
where security_level = '1'
我使用了以前版本中使用的以下代码

declare @tmp_table table(
PRG int identity(1,1) Primary Key,
patient_id int
)

declare @start_value int = 1,
 @finish_value int,
 @patient_id int

Insert Into @tmp_table(patient_id ) Select patient_id  From patient where  security_level = '1'

Select @finish_value = max(PRG) From  @tmp_table

While @start_value <= @finish_value 
Begin
  --now get a key for patient and store in variables
  Select @patient_id =  patient_id 
  From  @tmp_table
  Where PRG = @start_value 

  --.. and now update by key
  Update patient
  set security_level = '2'
  Where patient_id  = @patient_id 


Set @start_value = @start_value  + 1
End

直到所有行都受到影响?那也行

如果没有完整的代码,这很难。我猜您的更新语句与下面的代码冲突

如果(@numrows>1)

即使你使用

  Update patient
  set security_level = '2'
  Where patient_id  = @patient_id 
您的更新查询可能会影响多行。因此,我的最佳选择是将您的更新查询调整到下面,或者如果可以的话,更改触发器,这是可取的

 Update top (1) patient
  set security_level = '2'
  Where patient_id  = @patient_id 

如果您在更新代码中添加一个“GO 100”,那么应该可以做到这一点。如果它对触发器更新太快,您可能也需要在那里设置延迟

Update top (1) patient
set security_level = '2' 
where security_level = '1'
GO 100

执行的次数(在我的示例中为100次)取决于您。

引发问题的肯定是触发器的IF(@numrows>1),但是如果我更改它,很多事情都会中断。我可以做单独的更新,但我有大约200个要更新,所以我希望有一种方法可以让它更新200个,但是延迟每次更新之间的时间,这样它就会让它通过。更新顶部是一种更快的方法,可以一个接一个地进行更新,但是手动进行。在一个循环中更新200行会非常快(没有理由在中添加延迟-它不是那样工作的)。但是
@numrows
触发器削弱了基本的数据库功能(批量数据更改)你真的需要考虑为什么它在那里,以及如何永久删除它。这是一个坏主意,它闻起来好像有人不理解TrangeSt.开发者告诉我它有这样的设置是因为它将人口统计学发送到州,但是发送事务的java小程序不能发送质量变化。hat阻止了对表格的大量更改。这闻起来真的很糟糕。无论如何……你能确认
patient.patient\u id
是主键还是唯一的约束吗?如果不是,那就更糟糕了。patient\u id是主键。开发人员告诉我他们这样设置的原因是它将人口统计信息发送到州,但是java发送事务的小程序无法发送大量更改。开发人员认为这是一个好主意,这并不奇怪。无论如何,我不理解这里的全部内容。我们在一些客户端服务器上也有类似的限制,我们一次只能更新一个安全设置。进行这些更改需要更长的时间,但不管是好是坏,cl客户端这样做是出于安全原因。
Update top (1) patient
set security_level = '2' 
where security_level = '1'
GO 100