C# 数据库触发器还是应用程序代码?在这种情况下,我应该使用哪一个?

C# 数据库触发器还是应用程序代码?在这种情况下,我应该使用哪一个?,c#,sql-server,triggers,database-performance,C#,Sql Server,Triggers,Database Performance,使用c#和mssql 2008 R2,我有一个将用户插入系统的服务,用户有一个分配给他们的唯一号码,类似于a1、b1或c1,在用户插入时会增加,但在插入之前,我必须检查是否有以前的唯一号码可用(用户删除时可以删除唯一号码)。例如,如果数据库中有5个用户,a1、…、a5是保留的,如果删除,比如说第3个用户,那么a3将可用于下一个用户插入。这很容易做到,但由于每次插入时我都必须读取可用的唯一数字,所以我不知道在ins之前使用插入触发器还是使用应用程序代码更好耳鸣 提前感谢我不确定触发器以及您希望如何

使用c#和mssql 2008 R2,我有一个将用户插入系统的服务,用户有一个分配给他们的唯一号码,类似于a1、b1或c1,在用户插入时会增加,但在插入之前,我必须检查是否有以前的唯一号码可用(用户删除时可以删除唯一号码)。例如,如果数据库中有5个用户,a1、…、a5是保留的,如果删除,比如说第3个用户,那么a3将可用于下一个用户插入。这很容易做到,但由于每次插入时我都必须读取可用的唯一数字,所以我不知道在ins之前使用插入触发器还是使用应用程序代码更好耳鸣


提前感谢

我不确定触发器以及您希望如何这样做,但您肯定可以在代码/存储过程中实现这一点。这将是一个两步过程,必须在一个事务中完成:

  • 选择最小可用ID
  • 插入新记录
重要的一点是,您希望在select查询期间锁定该表,以防止其他进程获得相同的ID。您可以使用独占锁定提示来实现这一点。代码可能如下所示:

select min(T.ID) + 1 from TableName T with(xlock)
     where not exists (select * from TableName T1 where T1.ID = T.ID + 1)

我不确定触发器以及您希望如何这样做,但您肯定可以在代码/存储过程中实现这一点。这将是一个两步过程,必须在一个事务中完成:

  • 选择最小可用ID
  • 插入新记录
重要的一点是,您希望在select查询期间锁定该表,以防止其他进程获得相同的ID。您可以使用独占锁定提示来实现这一点。代码可能如下所示:

select min(T.ID) + 1 from TableName T with(xlock)
     where not exists (select * from TableName T1 where T1.ID = T.ID + 1)

谢谢你的回复Szymon,我不是在问算法,但我想问的是,如果我使用触发器或存储过程而不是代码,并将所有工作放在数据库本身而不是通过代码?以及+1提到锁,这会对性能产生任何影响。谢谢。我想无论你使用哪一个,你都会我必须运行类似类型的代码才能获得正确的ID。我个人会选择代码/存储过程,因为它使整个事情变得不那么复杂。是的,你所说的代码是真的,我想知道性能方面的问题,虽然在这里没有任何明显的区别,但作为一种最佳实践,我想知道:)不管怎样,谢谢你的回复Szymon,我不是在问算法,但我要问的是,如果我使用触发器或存储过程而不是代码,并将所有工作放在数据库本身而不是通过代码,性能会有什么不同吗?和+1,谢谢你提到锁。我想无论你使用哪一种,你都必须运行类似的代码才能获得正确的ID。我个人会选择代码/存储过程,因为它使整个事情变得不那么复杂。是的,你所说的代码是正确的,我想知道性能的情况,虽然它在这里没有任何明显的区别,但作为一个最佳实践,我想知道:)无论如何,谢谢。