Имитация столбца идентификаторов в триггере вставки - PullRequest
4 голосов
/ 28 мая 2010

У меня есть таблица для ведения журнала, для которой требуется идентификатор журнала, но я не могу использовать столбец идентификаторов, поскольку идентификатор журнала является частью комбинированного ключа.

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)

Чистый результат должен позволить мне вставить любое количество записей в StuffLogs с автоматическим вычислением столбца LogID.

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

Ответы [ 3 ]

3 голосов
/ 28 мая 2010

Если не существует жесткой бизнес-причины, которая требует, чтобы каждый LogID был последовательностью, начинающейся с 1 для каждого отдельного StuffID, тогда просто используйте идентификационные данные. При наличии идентификатора вы все равно сможете правильно упорядочивать строки с помощью StuffID + LogID, но у вас не возникнет проблем с вставкой при попытке сделать это вручную (параллелизм, взаимоблокировки, блокировки / блокировки, медленные вставки и т. Д.).

0 голосов
/ 28 мая 2010

Убедитесь, что LogId имеет значение по умолчанию NULL, чтобы его не нужно было указывать во время операторов вставки, как это было в столбце идентификаторов.

CREATE TRIGGER Insert ON dbo.StuffLogs
INSTEAD OF INSERT
AS
UPDATE #Inserted SET LogId = select max(LogId)+1 from StuffLogs where StuffId=[INSERTED].StuffId
0 голосов
/ 28 мая 2010
Select Row_Number() Over( Order By LogId ) + MaxValue.LogId + 1
From inserted
    Cross Join ( Select Max(LogId)  As Id From StuffLogs ) As MaxValue

Вам необходимо тщательно протестировать это и убедиться, что, если два соединения были вставлены в таблицу одновременно, вы не столкнетесь с LogId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...