我有一个需要日志ID的日志记录表,但我不能使用标识列,因为日志ID是组合键的一部分。模拟插入触发器内的标识列
create table StuffLogs
{
StuffID int
LogID int
Note varchar(255)
}
没有为StuffID
& LogID
组合键。
我想建立一个插入触发器,当插入日志记录时计算下一个LogID。我可以一次完成一条记录(请参阅下面的内容以了解如何计算LogID
),但这并不是很有效,我希望有一种方法可以在不使用游标的情况下执行此操作。
select @NextLogID = isnull(max(LogID),0)+1
from StuffLogs where StuffID = (select StuffID from inserted)
最终结果应该允许我插入任意数量的记录到自动计算的LogID列的StuffLog中。
StuffID LogID Note
123 1 foo
123 2 bar
456 1 boo
789 1 hoo
使用StuffID: 123, Note: bop
将导致以下记录插入另一个记录:
StuffID LogID Note
123 3 bop
你可能会想包装成这个BEGIN TRANSACTION ... END TRANSACTION,甚至可能是SET交易的IsolationLevel SERIALIZABLE开始与 - 只是为了确保没有两个连接可以在同一时间更新并获得相同的新ID返回 – 2010-05-28 17:27:39
@marc_s - 同意。这显然会对并发造成一些有害影响。 – Thomas 2010-05-28 17:32:19
>从StuffLogs中选择最大(Id)作为Id 1.您可以找到全局最大值,但不能插入StuffID。 (例如: )插入到StuffLogs(staffid,not)值(123,'a'),(123,'b'),... – msi77 2010-05-28 17:47:26